|  | Posted by drawnai on 06/19/58 11:45 
pb648174 wrote:> I have the following basic statements being executed:
 >
 > Create a temp table, #TempPaging
 >
 > Insert Into #TempPaging (Col1, Col2)
 > Select Col1, Col2 From SomeOtherTable Order By Col2, Col1
 >
 > Select * from #TempPaging
 >
 > I can't provide a reproduceable scenario right now without making this
 > into a 200K post, so I'm hoping someone will know what the issue is.. I
 > can't find anything regarding this in BOL.
 >
 > Basically the order is off a little bit every now and then when there
 > are large amounts of data, like more than a couple hundred rows. Is
 > there something I need to do to guarantee the originally selected
 > order?
 >
 > This is very important that it be in order from the original select
 > statement as this is for paging. Adding an order by in the second
 > select from the temp table will not fix the problem. In this particular
 > instance that I have reproduced we are using SQL 2005 but have also
 > seen this on SQL 2000 servers. I had previously asked this question as
 > I was using a SELECT INTO statement, but now we are manually creating
 > the temp table (Pain in the ass) and still having the same issue. Best
 > case scenario is for it to work for a SELECT INTO.
 
 In SQL 2005, use the RowNumber function in a nested sub query.
 
 In SQL 2000, create enough index columns to handle your sort orders.
 
 eg...
 Select Mycol1, MyCol2, Mycol3,
 MyIDX1 = Convert (Int, Null) ,
 MyIDX2 = Convert (Int, Null) ,
 MyIDX3 = Convert (Int, Null)
 into #myResults
 Select blah from whatever order by whatever
 
 contrary to David Portas' assertion this does actually work most of the
 time, however, I sure it can't be relied upon, though I've never seen
 it fail...
 
 Then, to have multiple order bys, and very very cheap and easy
 pagination you then do.
 
 Create Index #IDX1 on #myResults (Mycol1, Mycol2)
 Create Index #IDX2 on #myResults (Mycol3, Mycol1)
 Create Index #IDX3 on #myResults (Mycol2, Mycol3)
 Followed by...
 
 Declare @Fred int
 set @Fred = 0
 Update M
 Set @Fred = MyIDX1 = @Fred + 1
 >From #myResults M
 With (Index = #IDX1)
 
 set @Fred = 0
 Update M
 Set @Fred = MyIDX2 = @Fred + 1
 >From #myResults M
 With (Index = #IDX2)
 
 set @Fred = 0
 Update M
 Set @Fred = MyIDX3 = @Fred + 1
 >From #myResults M
 With (Index = #IDX3)
 
 Select *
 >From #MyResults
 Where IDX Between @X1 And @X2
 
 >
 > Any ideas?
  Navigation: [Reply to this message] |