Câu trả lời:
Lưu ý, các dấu ngoặc đơn là bắt buộc cho các câu lệnh CẬP NHẬT:
update top (100) table1 set field1 = 1
Không có ORDER BY
toàn bộ ý tưởng TOP
không có ý nghĩa nhiều. Bạn cần có một định nghĩa nhất quán về hướng nào là "lên" và hướng nào là "xuống" để khái niệm đỉnh có ý nghĩa.
Tuy nhiên, SQL Server cho phép nhưng không đảm bảo kết quả xác định .
Các UPDATE TOP
cú pháp trong câu trả lời được chấp nhận không hỗ trợ một ORDER BY
khoản nhưng nó có thể để có được ngữ nghĩa xác định ở đây bằng cách sử dụng một CTE hoặc bảng nguồn gốc để xác định thứ tự sắp xếp mong muốn như dưới đây.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
TOP
tỷ lệ cược là bạn nên sử dụng nó ORDER BY
bởi vì những gì bạn quan tâm giống như "nhất" hoặc "ít nhất" của một cái gì đó. Tuy nhiên, trong các trường hợp khác, bạn chỉ có thể quan tâm đến việc nhận một bản ghi khớp. Giống như tôi hôm nay! Tôi cần sửa từng vấn đề dữ liệu (chu kỳ) một lần. Toàn bộ quá trình sửa lỗi bao gồm một tập lệnh db, một số can thiệp của người dùng và một số hoạt động của ứng dụng. Chúng tôi không quan tâm hồ sơ WHICH đã được xử lý đầu tiên. Chúng tôi chỉ quan tâm rằng chúng tôi đã xử lý chúng cùng một lúc.
WHERE
điều khoản để loại trừ các hồ sơ được xử lý trước đó. Câu hỏi như được viết và chấp nhận câu trả lời là khá vô nghĩa. BTW: Để sử dụng các bảng làm hàng đợi, đây là một liên kết khá hữu ích
where
mệnh đề để tránh xử lý các hàng giống nhau nhiều lần.
đối với những người như tôi vẫn bị mắc kẹt với SQL Server 2000, SET ROWCOUNT {number};
có thể được sử dụng trước khi UPDATE
truy vấn
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
sẽ giới hạn cập nhật xuống 100 hàng
Nó đã bị từ chối ít nhất kể từ SQL 2005, nhưng kể từ SQL 2017, nó vẫn hoạt động. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
Điều thú vị hơn nữa là bạn có thể sử dụng Hàm Bảng giá trị nội tuyến để chọn hàng (và số lượng qua TOP
) hàng để cập nhật. Đó là:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
Đối với hàm có giá trị bảng, bạn có một cái gì đó thú vị để chọn hàng để cập nhật như:
CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
@Param1 INT,
@Param2 INT,
@Param3 INT
)
RETURNS TABLE AS RETURN
(
SELECT TOP(1) MyTable.*
FROM MyTable
JOIN MyOtherTable
ON ...
JOIN WhoKnowsWhatElse
ON ...
WHERE MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
..., và có những lời nói dối (theo ý kiến khiêm tốn của tôi) sức mạnh thực sự của việc chỉ cập nhật các hàng được chọn hàng đầu một cách xác định đồng thời đơn giản hóa cú pháp của UPDATE
câu lệnh.
Thử:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
Bạn cũng có thể cập nhật từ lựa chọn bằng cách sử dụng bí danh và tham gia:
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
order by
là tốt?