Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich identity_insert auf einen als Variable übergebenen Tabellennamen setzen?

Nur um Brads Antwort in den Kommentaren zu untermauern, hier ist ein MVCE, in dem die gesamte Einfügungssequenz in einer einzigen dynamischen Abfrage ausgeführt wird. Stellen Sie gemäß dem Kommentar von Kris sicher, dass der Datenbankname auf der weißen Liste steht, da die Abfrage anfällig für SqlInjection ist (leider können Datenbanknamen in dynamischem SQL nicht über sp_executesql parametrisiert werden). )

Gegeben:

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

Ein einzelner Batch kann ausgeführt werden:

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)