Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso impostare identity_insert su un tablename passato come variabile

Solo per eseguire il backup della risposta di Brad fornita nei commenti, ecco un MVCE di eseguire l'intera sequenza di inserimento in un'unica query dinamica. Secondo il commento di Kris, assicurati che il nome del database sia nella lista bianca, poiché la query è vulnerabile a SqlInjection (sfortunatamente, i nomi dei database non possono essere parametrizzati in sql dinamico tramite sp_executesql )

Dato:

CREATE TABLE TableName
(
    ID INT IDENTITY(1,1)
);

È possibile eseguire un unico batch:

DECLARE @strDBName VARCHAR(100) = 'MyDatabase';
Declare @Query Varchar(MAX)
SET @Query = 'SET IDENTITY_INSERT '+ @strDBName +'..TableName ON; '
SET @Query = @Query + 'INSERT INTO '+ @strDBName 
 +'..[TableName](ID) SELECT COALESCE(MAX(ID), 0)+1 FROM '+ @strDBName +'..TableName; '
SET @Query = @Query + 'SET IDENTITY_INSERT '+ @strDBName +'..TableName OFF;'
EXEC(@Query)