Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Cannot work after page it

Posted on 2009-05-18
2
Medium Priority
?
223 Views
Last Modified: 2012-05-07
I have a sql statement, it can work properly as below SQL1.

I need to page it though a page function PAGE. The PAGE works properly for all the other sqls.

But the new page SQL2 select no results.

Any suggestion?

SQL1:
select ack, Date, [Time], Region, Station, Panel, Phase, VoltageLevel, [Value],  Comments
 from
gensum left join comment ON gensum.commentkey=comment.comment_id where ((Date>'2008-05-18' or (Date='2008-05-18' and Time>'00:00:00')) and (Date<'2009-05-18' or (Date='2009-05-18' and Time<'18:36:06')))

SQL2
returnpage 'select ack, Date, [Time], Region, Station, Panel, Phase, VoltageLevel,
[Value],
Comments
 from
gensum left join comment ON gensum.commentkey=comment.comment_id where ((Date>''2008-05-18'' or (Date=''2008-05-18'' and Time>''00:00:00'')) and (Date<''2009-05-18'' or (Date=''2009-05-18'' and Time<''18:36:06'')))', 'Date asc, Time asc, gensumid asc', 1, 26
PAGE function:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ReturnPage](@Select varchar(8000), @OrderBy varchar(8000), 
                            @StartRow int, @EndRow int)
AS
BEGIN
declare @ColList varchar(8000);
declare @Where varchar(8000);
declare @i int;  
declare @i2 int;
declare @tmp varchar(8000);
declare @dec varchar(8000);
declare @f varchar(1000);
declare @d varchar(1000);
declare @Symbol char(20);
declare @SQL varchar(8000);
declare @Sort varchar(8000);
 
set @Sort = @OrderBy + ', '
set @dec = ''
set @Where  = ''
set @SQL = ''
set @i = charindex(',' , @Sort)
 
while @i != 0
 begin
  set @tmp = left(@Sort,@i-1)
  set @i2 = charindex(' ', @tmp)
  set @f = ltrim(rtrim(left(@tmp,@i2-1)))
  set @d = ltrim(rtrim(substring(@tmp,@i2+1,100)))
  set @Sort = rtrim(ltrim(substring(@Sort,@i+1,100)))
  set @i = charindex(',', @Sort)
  set @symbol = case when @d = 'ASC' then '>' else '<' end + 
                case when @i=0 then '=' else '' end
 
  set @dec = @dec + 'declare @' + @f + ' sql_variant; '
  set @ColList = isnull(replace(replace(@colList,'>','='),'<','=') + ' and ','') +
                 @f + @Symbol + ' @' + @f
  set @Where = @Where + ' OR (' + @ColList + ') '
  set @SQL = @SQL + ', @' + @f + '= ' + @f
 end
 
set @SQL = @dec + ' ' +
           'SET ROWCOUNT ' + convert(varchar(10), @StartRow) + '; ' +
           'SELECT ' + substring(@SQL,3,7000) + ' from (' + @Select + ') a ORDER BY ' +
           @OrderBy + '; ' + 'SET ROWCOUNT ' + 
           convert(varchar(10), 1 + @EndRow - @StartRow) + '; ' +
           'select * from (' + @Select + ') a WHERE ' + 
           substring(@Where,4,7000) + ' ORDER BY ' + @OrderBy + '; SET ROWCOUNT 0;'
 
exec(@SQL)
END

Open in new window

0
Comment
Question by:turbot_yu
  • 2
2 Comments
 
LVL 32

Accepted Solution

by:
Brendt Hess earned 2000 total points
ID: 24497536
You may be better off with a function using the SQL 2005 ROW_NUMBER() functionality.  Consider your original query to your paging function:

returnpage 'select ack, Date, [Time], Region, Station, Panel, Phase, VoltageLevel,
[Value],
Comments
 from
gensum left join comment ON gensum.commentkey=comment.comment_id where ((Date>''2008-05-18'' or (Date=''2008-05-18'' and Time>''00:00:00'')) and (Date<''2009-05-18'' or (Date=''2009-05-18'' and Time<''18:36:06'')))', 'Date asc, Time asc, gensumid asc', 1, 26

This could be subsumed as a stored procedure, using ROW_NUMBER(), and be easily executed - example:

CREATE PROCEDURE ReturnPage
    @Fields varchar(2000),
    @FromWhere varchar(4000),
    @Order varchar(1024),
    @Page int,
    @RowsPerPage int
AS
    DECLARE @sql varchar(8000)
    SET @sql = 'WITH rs AS (SELECT ' + @Fields + ', ROW_NUMBER() OVER (ORDER BY ' + @Order + ') AS wkrnx ' + @FromWhere + ') SELECT ' + @Fields + ' FROM rs WHERE wkrnx BETWEEN ' + Cast((Page - 1) * @RowsPerPage + 1 as varchar(10)) + ' AND ' + Cast(Page * RowsPerPage as Varchar(10))'

EXEC (@sql)

EXEC ReturnPage, 'ack, Date, [Time], Region, Station, Panel, Phase, VoltageLevel, [Value],  Comments', 'FROM gensum
LEFT JOIN comment
      ON gensum.commentkey=comment.comment_id
WHERE (Date>'2008-05-18' or (
            Date='2008-05-18'
            and Time>='00:00:00'            -- What handles time 0 exactly?  Use gt or eq here
            )
      ) and (Date<'2009-05-18' or (
            Date='2009-05-18'
            and Time<'18:36:06'
            )
      )', 'Date asc, Time asc, gensumid asc', 1, 26

Granted, you must break up the source query a bit more, but the execution should be quicker, and the understandability of the code is increased quite a bit.
0
 
LVL 32

Assisted Solution

by:Brendt Hess
Brendt Hess earned 2000 total points
ID: 24497548
I wish I could edit comments.  Sigh

The section of SQL through EXEC (@sql) is the stored procedure.  The SQL below that is an invocation of that stored procedure.
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Data architecture is an important aspect in Software as a Service (SaaS) delivery model. This article is a study on the database of a single-tenant application that could be extended to support multiple tenants. The application is web-based develope…
Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
When cloud platforms entered the scene, users and companies jumped on board to take advantage of the many benefits, like the ability to work and connect with company information from various locations. What many didn't foresee was the increased risk…
Enter Foreign and Special Characters Enter characters you can't find on a keyboard using its ASCII code ... and learn how to make a handy reference for yourself using Excel ~ Use these codes in any Windows application! ... whether it is a Micr…

572 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question