2010-11-02 41 views
9

Tôi có một truy vấn cho phép tôi lấy các bản ghi từ một bảng cơ sở dữ liệu bằng cách cho nó một giới hạn tối thiểu và tối đa.Máy chủ SQL ROW_NUMBER() trên SQL Server 2000?

Nó đi như thế này:

SELECT T1.CDUSUARIO, T1.DSALIAS, T1.DSNOMBRE_EMPRESA, T1.DSCARGO, T1.DSDIRECCION_CORREO, T1.CDUSUARIO_ADMINISTRADOR, T1.FEMODIFICACION 
    FROM (SELECT *, 
       ROW_NUMBER() OVER (ORDER BY CDUSUARIO) as row FROM TBL_USUARIOS) as T1 
    WHERE row > @limiteInf 
    and row <= @limiteSup 
ORDER BY DSALIAS ASC; 

Bây giờ, nó hoạt động giống như thiên đường trên SQL Server 2005 và SQL Server 2008 nhưng đã cố gắng để chạy nó trên một cơ sở dữ liệu SQL Server 2000 và nói:

ROW_NUMBER là tên hàm không xác định hoặc một cái gì đó tương tự.

Tôi có thể làm gì ??

Trả lời

4

Sử dụng chức năng khác hoặc nâng cấp cơ sở dữ liệu của bạn. ROW_NUMBER không tồn tại trong phiên bản 2000 của cơ sở dữ liệu. Điểm. Bạn không thể làm gì nữa đâu.

+4

điều này dường như không hữu ích. ông rõ ràng biết nó không phải là vào năm 2000, thông báo lỗi nói với ông điều này. –

+1

@nathan gonzalez: nó thực sự là sự thật cơ bản mặc dù: không có thay thế thanh lịch – gbn

+0

chính xác. Downvoting becasue bạn không thích sự thật không phải là hữu ích hoặc là, bạn biết. đó là sự thật. Hàm này đã được giới thiệu sau năm 2000 vì nó bị thiếu. Không có thay thế hiệu suất tương tự. – TomTom

11
  • Có một COUNT (*) với TỰ THAM GIA giải pháp here mà sẽ mở rộng quy mô nặng
  • Bạn có thể tải một bảng tạm thời với một cột IDENTITY và đọc lại nhưng nó không được bảo đảm để làm việc (không thể tìm thấy bài viết vào nó, được cho biết tại một MS Hội thảo năm trước)

Cả giải pháp sẽ hỗ trợ phân vùng bằng cách

tôi đã không được đề cập giải pháp vòng lặp hoặc CURSOR dựa mà có lẽ là tồi tệ hơn

Sửa 20 tháng năm 20011

Ví dụ demo của lý do tại sao SẮC sẽ không làm việc:
Do Inserted Records Always Receive Contiguous Identity Values

+1

+1: COUNT/tự tham gia cũng giống như sử dụng RANK/DENSE_RANK vì các bản sao sẽ nhận được cùng một giá trị –

+0

@OMG Ngựa vằn: điểm tốt, tôi đã quên mất quá lâu :-) – gbn

+0

"Cả hai giải pháp đều không hỗ trợ PARTITION B "NG ". Bạn có thể GROUP BY khi tải vào bảng tạm thời. Sau đó, thêm IDENTITY để lấy id cho mỗi nhóm. Sau đó, bạn có thể tham gia bảng tạm thời đó với truy vấn ban đầu của mình. – jumxozizi

3

Tôi biết chủ đề này là hơi cũ, nhưng đối với bất cứ ai khác tìm kiếm cùng một giải pháp, tôi nghĩ rằng nó sẽ hữu ích để biết rằng có một giải pháp tốt cho vấn đề này.

Xin xem link gốc here

Đối với những người không muốn nhấp vào liên kết, tôi đã sao chép và dán đoạn code dưới đây. Một lần nữa, tín dụng đi đến original publisher

Dưới đây là SQL bên dưới cho SQL Server 2000 để chọn phiên bản mới nhất của một nhóm bản ghi theo một cột đơn.

SELECT * 
    FROM (
    SELECT *, (
     SELECT COUNT(*) 
     FROM MyTable AS counter 
     WHERE counter.PartitionByColumn = MyTable.PartitionByColumn 
     AND counter.OrderByColumn >= MyTable.OrderByColumn 
    ) AS rowNumber 
    FROM MyTable 
) AS r1 
    WHERE r1.rowNumber = 1 

Cùng mã trong SQL Server 2005 sẽ trông như thế này:

SELECT * FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY PartitionByColumn 
    ORDER BY OrderByColumn DESC) AS rowNumber FROM MyTable) AS rw1 
    WHERE rw1.rowNumber = 1 
-1

Đây là giải pháp của tôi cho vấn đề:

declare @i int 
declare @t table (row int, stuff varchar(99)) 
insert into @t 
select 0,stuff from mytable -- <= your query 
set @i=0 
update @t set [email protected], @[email protected]+1 
select * from @t 

Giải thích:

  1. tạo bảng bộ nhớ
  2. chèn dữ liệu (truy vấn của bạn) với số hàng là 0
  3. cập nhật trường số hàng với biến int được tăng lên trong cùng một bản cập nhật cho bản ghi tiếp theo (thực tế biến được tăng lên trước và sau đó được cập nhật, vì vậy sẽ bắt đầu từ 1)
  4. "chọn" kết quả từ bảng bộ nhớ.

Bạn có thể hỏi, tại sao tôi không sử dụng biến trong câu lệnh chọn? Nó sẽ đơn giản hơn nhưng không được phép, chỉ khi không có kết quả. Nó là ok để làm điều đó trong một bản cập nhật.

+0

Hãy giải thích những gì bạn đang làm ở đó – winklerrr

Các vấn đề liên quan