2011-04-18 7 views

Odpowiedz

9

Można użyć pilota SIDE 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;

Alternatywnie, można użyć OPENQUERY:

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

Czy to zachowanie zmieniło się między SQL 2005/2008 a 2008R2? –

+0

@GaryKindel: Nie jestem pewien, czy rozumiem, co dokładnie masz na myśli, ale dzięki twojemu komentarzowi zauważyłem, że przeoczyłem jedną rzecz, wtedy 'N' na początku stałej ciągu w pierwszym fragmencie. (Zaktualizowałem teraz moją odpowiedź.) Z pewnością jest to wymagane w SQL Server 2008 R2, nie mam pewności co do wcześniejszych wersji. Zastanawiam się, czy brak "N" był powodem, dla którego zadałeś pytanie. –

+0

Wpadłem na problem, który dziś spowodowałem, próbując użyć Scope_indentity() na INSERT przez serwer połączony. To właśnie mnie zaskoczyło przez ten błąd w moim projekcie. Właśnie zastanawiałem się czy Scope_indentity() zawsze była lokalna w SQL 2008. Myślałem, że to mogło być nowe zachowanie z R2. –

0

spróbować czegoś takiego:

--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()') 

EXEC zwróci tabelę wynikową zawierającą wartość

SCOPE_IDENTITY()

Jeśli musisz to zrobić dla SQL Server 2005+ możesz po prostu dodać OUTPUT INSERTED.IdentityColumn, aby uzyskać zestaw wyników identyfikatorów. Dodaj do tego INTO i możesz przechowywać je w zmiennej tabeli/tabeli na komputerze lokalnym.

+0

Próbowałem, ale zwraca NULL. Co jest nie tak? Oto mój kod: ** exec ('insert [(Worker)]. Identification.dbo.test (name) values ​​(' 'gg' '); select scope_identity()') ** –

+0

To przyniesie efekty. Zwróci wartość NULL lub 0. Działa dobrze dla lokalnego SQL DB, ale nie dla połączonego. – WiredEarp

1

Jeszcze inny wariant, w przypadku połączone użytkownik ma uprawnienia do procedur zadzwonić na Serwer połączony:

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

musiałem użyć parametru wyjściowego takiego: 'DEKLARUJĄ @ScopeIdentity int EXEC [linkedServerName] [database].. [schema] .sp_executesql N ' INSERT INTO [table] ... SELECT SCOPE_IDENTITY()', N '@ ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT' –