2011-04-18 26 views
11

Tôi đang chèn bản ghi vào một Máy chủ Sql từ xa bằng máy chủ Liên kết, Bây giờ tôi muốn lấy id của bản ghi được chèn. giống như scope_identity() trong máy chủ cục bộ. Máy chủ sql từ xa của tôi là phiên bản 2000.Cách tốt nhất để có được danh tính của hàng được chèn vào trong Máy chủ được liên kết?

Tôi đã thấy this post nhưng tôi không thể thêm bất kỳ thủ tục lưu trữ trong máy chủ sql từ xa

Trả lời

9

Bạn có thể sử dụng ở phía xa của sp_executesql:

DECLARE @ScopeIdentity (ID int); 
INSERT INTO @ScopeIdentity 
EXEC server.master..sp_executesql N' 
    INSERT INTO database.schema.table (columns) VALUES (values); 
    SELECT SCOPE_IDENTITY()'; 
SELECT * FROM @ScopeIdentity;

Ngoài ra, bạn có thể sử dụng OPENQUERY:

SELECT * 
FROM OPENQUERY(server, ' 
    INSERT INTO database.schema.table (columns) VALUES (values); 
    SELECT SCOPE_IDENTITY() AS ID');
+0

Hành vi này có thay đổi giữa SQL 2005/2008 đến 2008R2 không? –

+0

@GaryKindel: Không chắc tôi hiểu chính xác ý bạn là gì, nhưng nhờ nhận xét của bạn, tôi nhận thấy rằng tôi đã bỏ lỡ một điều sau đó, 'N' ở đầu chuỗi liên tục trong đoạn đầu tiên. (Cập nhật câu trả lời của tôi ngay bây giờ.) Nó chắc chắn được yêu cầu trong SQL Server 2008 R2, không chắc chắn về các phiên bản trước đó. Tôi tự hỏi nếu sự vắng mặt của 'N' là lý do đằng sau việc bạn đặt câu hỏi. –

+0

Tôi đã gặp phải sự cố ngày hôm nay do cố gắng sử dụng Scope_indentity() trên INSERT qua máy chủ được liên kết. Nó chỉ bắt tôi bằng cách bảo vệ bởi lỗi này trong dự án của tôi. Tôi đã chỉ tự hỏi nếu Scope_indentity() luôn luôn là địa phương trong SQL 2008. Nghĩ rằng điều này có thể đã được hành vi mới với R2. –

0

thử một cái gì đó như thế này:

--when RemoteTable is (Rowid int identity(1,1) primary key, rowValue varchar(10)) 
exec ('INSERT server.database.owner.RemoteTable (rowValue) VALUES (''wow'');select SCOPE_IDENTITY()') 

các EXEC sẽ trả về một tập kết quả có chứa các giá trị SCOPE_IDENTITY()

nếu bạn phải làm điều này cho SQL Server 2005+ bạn chỉ có thể thêm một OUTPUT INSERTED.IdentityColumn để có được tập hợp kết quả của (các) số nhận dạng. Thêm INTO vào đó OUTPUT và bạn có thể lưu trữ chúng trong một biến bảng/bảng trên máy địa phương.

+0

Tôi đã thử nó, nhưng nó trả về NULL. chuyện gì vậy? Đây là mã của tôi: ** exec ('insert [(Worker)]. Các giá trị Identification.dbo.test (name) (' 'gg' '); select scope_identity()') ** –

+0

Điều đó sẽ không hoạt động. Nó sẽ trả về NULL hoặc 0. Nó sẽ làm việc tốt cho một DB SQL cục bộ, nhưng không hoạt động đối với một DB được liên kết. – WiredEarp

1

sử dụng Tuy nhiên sự thay đổi khác, trong trường hợp liên quan có quyền gọi thủ tục về máy chủ được liên kết:

DECLARE @ScopeIdentity int 
EXEC @ScopeIdentity = [linkedServerName].[database].[schema].sp_executesql N' 
    INSERT INTO [table] ... 
    SELECT SCOPE_IDENTITY()' 
+0

Tôi phải sử dụng tham số OUTPUT như sau: 'DECLARE @ScopeIdentity int EXEC [linkedServerName]. [Database]. [schema] .sp_executesql N ' INSERT INTO [table] ... SELECT SCOPE_IDENTITY()', N '@ ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT' –

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