Solved

Cannot work after page it

Posted on 2009-05-18
2
196 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:
bhess1 earned 500 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:bhess1
bhess1 earned 500 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
SQL Trigger selecting another database 4 34
Order by but want it in specific order 2 26
CONVERT date time to a different time zone. 2 45
Need help with a query 6 67
I've encountered valid database schemas that do not have a primary key.  For example, I use LogParser from Microsoft to push IIS logs into a SQL database table for processing and analysis.  However, occasionally due to user error or a scheduled task…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.
As a trusted technology advisor to your customers you are likely getting the daily question of, ‘should I put this in the cloud?’ As customer demands for cloud services increases, companies will see a shift from traditional buying patterns to new…

920 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

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now