Solved

Cannot work after page it

Posted on 2009-05-18
2
199 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

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
T-SQL to Update Table Dynamically 2 47
Upgrading SQL 2005 Express to 2008 R2 Express 31 88
Caste datetime 2 57
How can i use WITH CTE for checking exist value? 3 30
Introduction This article will provide a solution for an error that might occur installing a new SQL 2005 64-bit cluster. This article will assume that you are fully prepared to complete the installation and describes the error as it occurred durin…
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

785 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