2010-07-06 28 views
10

Tôi có trình kích hoạt sau nhưng cần ti tìm thấy danh tính của hàng nên tôi không cập nhật tất cả các bản ghi trong bảng. Làm thế nào tôi có thể nhận được danh tính của hàng bị ảnh hưởng?Bản sắc của hàng được chèn/cập nhật trong trình kích hoạt

BEGIN 
    UPDATE tb_Division SET LastModified = GetDate() WHERE "id of inserted/updated row" 
END 

Trả lời

15

Kể từ khi kích hoạt một trong MS SQL Server không phân biệt giữa đơn kỷ lục và nhiều kỷ lục hoạt động, bạn nên THAM GIA bảng với bảng pseudo chèn hoặc sử dụng một subselect:

UPDATE tb_Division 
SET LastModified = GETDATE() 
WHERE id IN (SELECT id FROM INSERTED) 

id là chính cột chính của bảng.

4

Bạn đã xem id của bảng logic inserted chưa? Bạn phải cẩn thận khi sử dụng gây nên, như một kích hoạt có thể được hoạt động trên nhiều hơn một dòng:

UPDATE tb_Division AS td 
    SET LastModified = GetDate() 
FROM INSERTED AS i 
WHERE td.id = = i.id 

Xem here để biết thêm chi tiết, và từ MSDN:

DML gây nên sử dụng xóa và các bảng logic (khái niệm) được chèn vào. Chúng có cấu trúc tương tự như bảng mà trình kích hoạt được định nghĩa, đó là bảng mà hành động người dùng được thử. Các bảng đã xóa và chèn giữ các giá trị cũ hoặc các giá trị mới của các hàng có thể được thay đổi bởi hành động của người dùng. Ví dụ: để truy xuất tất cả các giá trị trong bảng đã xóa, hãy sử dụng:

+0

cảm ơn các liên kết. – Chin

0

Tâm trí bạn - trình kích hoạt có thể xử lý hàng tấn cùng một lúc - bạn sẽ phải tính đến điều đó!

Bạn cần tham gia bảng của bạn để được cập nhật với Inserted pseudo-cột vào đó trường ID:

UPDATE dbo.tb_Division 
SET LastModified = GetDate() 
FROM Inserted i 
WHERE tb_Division.Id = i.Id 

hoặc một cái gì đó như thế.

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