Ich habe einen Verbindungsserver, Ich möchte einen Datensatz in der Tabelle auf dem Verbindungsserver hinzufügen, Ist es möglich, @@ Identität von einem anderen Server mit Verbindungsserver nehmen? (SQL Server 2005)get @@ Identität von einem anderen Server (Verbindungsserver)
Antwort
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?).
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()'
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? –
@ 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
Ist es meine, sollte ich meine insert-Anweisung und dann SCOPE_IDENTITY() danach in der gespeicherten Prozedur in remote Server? –