2009-09-28 50 views
8

Tôi cần phải cập nhật N hàng đầu tiên trong một bảng đáp ứng điều kiện.Làm cách nào để cập nhật n hàng trong bảng?

Tôi biết tôi có thể thực hiện Cập nhật hàng đầu ... nhưng vấn đề là N ở trong @variable.

CẬP NHẬT TOP @N SET ... không hoạt động.

Có cách nào để thực hiện việc này mà tôi chỉ thiếu?

Không có định nghĩa bảng cụ thể ở đây vì nó không quan trọng những gì cột là .. Nếu tôi có thể làm điều đó cho một bảng một cột tôi có thể làm điều đó cho bảng của tôi.

Trả lời

16

Bạn cần phải sử dụng dấu ngoặc sau TOP khoản khi bạn muốn sử dụng một biến:

UPDATE TOP(@N) ... 
+0

Bí quyết tuyệt vời! Cảm ơn vì đã dạy nó cho tôi. Điều thú vị là cú pháp này không hoạt động với cấu trúc 'SELECT TOP n'. Tôi có thể lý do tại sao điều đó sẽ xảy ra, mặc dù nó là một phần của một bất đối xứng lẻ trong TSQL. – mjv

+0

'SELECT TOP n' chỉ hoạt động nếu' n' là hằng số, không phải là biến. Nó hoạt động như thế trước năm 2005. 'TOP' với một đối số biến và' TOP' cho các câu lệnh DML đã được thêm từ năm 2005 và yêu cầu các mệnh lệnh. –

+0

Điều này sẽ thực sự mát mẻ, tuy nhiên, "cập nhật top (@N) thiết lập systemuserid = @ID nơi systemuserid là null" mang lại cho tôi "cú pháp sai gần từ khóa 'set'". – Moose

10
WITH q AS 
     (
     SELECT TOP (@r) * 
     FROM mytable 
     ORDER BY 
       col1 
     ) 
UPDATE q 
SET  co12 = @value 

UPDATE TOP (@r) sẽ làm việc nhưng nó sẽ cập nhật bất kỳ @r hàng không theo thứ tự đặc biệt.

Từ documentation:

Các hàng được tham chiếu trong các biểu hiện TOP sử dụng với INSERT, UPDATE, hoặc DELETE không sắp xếp theo thứ tự bất kỳ. TOP n trả lại n hàng ngẫu nhiên.

+0

'@ KM': lần này tôi đã chỉnh sửa câu lệnh * trước * bạn chỉ rõ :) – Quassnoi

+0

+1, tôi nghe để tìm hiểu, vì vậy tôi thử nhiều mã, không bao giờ thấy CẬP NHẬT của CTE, tôi sẽ phải chơi với điều đó một chút ... –

+0

'@ KM': rất hữu ích để xóa các bản sao. http://explainextended.com/2009/03/14/deleting-duplicates/ – Quassnoi

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