2011-04-18 4 views

risposta

9

Si potrebbe utilizzare il lato remoto 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;

In alternativa, è possibile utilizzare OPENQUERY:

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

Questo comportamento è cambiato tra SQL 2005/2008 a 2008R2? –

+0

@GaryKindel: Non sono sicuro di capire cosa intendi esattamente, ma grazie al tuo commento ho notato che mi mancava una cosa allora, il 'N' all'inizio della costante di stringa nel primo frammento. (Aggiornato ora la mia risposta). È sicuramente richiesto in SQL Server 2008 R2, non è sicuro delle versioni precedenti. Mi chiedo se l'assenza di "N" sia stata la ragione per cui hai fatto la domanda. –

+0

Oggi mi sono imbattuto in un problema causato dal tentativo di utilizzare Scope_indentity() su un INSERT tramite un server collegato. Mi ha colto alla sprovvista da questo errore nel mio progetto. Mi stavo chiedendo se Scope_indentity() fosse sempre locale in SQL 2008. Pensavo che questo potesse essere un nuovo comportamento con R2. –

0

provare qualcosa di simile:

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

l'Exec restituire un set di risultati che contiene il valore di SCOPE_IDENTITY()

se è necessario eseguire questa operazione per SQL Server 2005+, è sufficiente aggiungere uno OUTPUT INSERTED.IdentityColumn per ottenere un set di risultati delle identità. Aggiungi un INTO su quello OUTPUT ed è possibile memorizzarli in una variabile tabella/tabella sul computer locale.

+0

L'ho provato, ma restituisce NULL. Cosa c'è che non va? Questo è il mio codice: ** exec ('insert [(Worker)]. Identification.dbo.test (name) values ​​(' 'gg' '); select scope_identity()') ** –

+0

Che non funziona. Restituirà NULL o 0. Funzionerà bene per un DB SQL locale, ma non per uno collegato. – WiredEarp

1

utente Ancora un'altra variante, nel caso legato ha permesso di chiamare procedure su server collegato:

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

ho dovuto usare un parametro di output come questo: 'DICHIARA @ScopeIdentity int EXEC [LinkedServerName] [database].. [schema] .sp_executesql N ' INSERISCI IN [tabella] ... SELEZIONA SCOPE_IDENTITY()', N '@ ScopeIdentityOUT INT OUTPUT', @ScopeIdentityOUT = @ScopeIdentity OUTPUT' –