2010-12-27 7 views

Antwort

5

Sie können eine gespeicherte Prozedur auf Ihrem Verbindungsserver erstellen, der die Identität zurückgibt.

Sie sollten SCOPE_IDENTITY() anstelle von @@IDENTITY übrigens verwenden.

Siehe this Verwandte Frage (Der beste Weg, um Identität der eingefügten Zeile?).

+0

Was bedeutet es, gespeicherte Prozeduren zu erstellen? Ich führe diesen Verbindungsservercode aus: "Einfügen in [(local)]. Identification.dbo.test (Name) Werte ('gg')" Was soll ich nun tun, um die ID des eingefügten Datensatzes zu erhalten? –

+0

@ Raymond Morphy - ich meine genau das. Erstellen Sie eine gespeicherte Prozedur mit diesem Code auf dem Verbindungsserver, lassen Sie 'SCOPE_IDENTITY()' zurück und Sie sollten OK sein. Ihre Abfrage hat nur Zugriff auf die Servervariablen _local_, nicht auf die Variablen des Remoteservers. – Oded

+0

Ist es meine, sollte ich meine insert-Anweisung und dann SCOPE_IDENTITY() danach in der gespeicherten Prozedur in remote Server? –

0

Verwenden von SQL Server 2012 hier.

Ich habe gbn Methode versucht, aber ich habe diesen Fehler:

Msg 405, Level 16, State 1, Line 1 
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement. 

Abgesehen davon, ich brauchte die SET XACT_ABORT ON; vor meiner Erklärung hinzufügen, wie ich verteilte Transaktionen verwendet hat.

So landete ich sowohl die Probleme zu lösen, indem dies zu tun:

BEGIN DISTRIBUTED TRANSACTION 

SELECT idcolumn 
FROM OPENQUERY(MyRemoteServer, ' 
    SET XACT_ABORT ON; 
    INSERT INTO MyRemoteBD.dbo.SomeTable(col1,col2, ...) 
    OUTPUT INSERTED.idcolumn 
    VALUES (val1,val2, ...); 
    SET XACT_ABORT OFF'); 

COMMIT 

Und ich konnte dies in einer verteilten Transaktion auszuführen, während die Identität von meinem Einsatz zu bekommen.

Ein seltsames Verhalten über diese Aussage ist, dass, wenn ich die Insert-Anweisung ohne vorherige Öffnen der verteilten Transaktion (muss die verteilte sein) wird es die nächste Identität, aber es wird nichts einfügen. Ich habe keine Ahnung, warum das passiert.

Edit:

diese andere Methode ausprobiert und es hat ohne die Notwendigkeit der Einstellung XACT_ABORT ON auf verteilte Transaktionen gearbeitet und arbeitet ohne Transaktionen in Ordnung.

exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N' 
    INSERT INTO SomeTable (col1,col2,...) 
    VALUES (val1,val2,...); 
    SELECT SCOPE_IDENTITY()'