Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je définir identity_insert sur un nom de table passé en tant que variable

Juste pour sauvegarder la réponse de Brad donnée dans les commentaires, voici un MVCE de faire toute la séquence d'insertion dans une seule requête dynamique. Selon le commentaire de Kris, assurez-vous que le nom de la base de données est sur liste blanche, car la requête est vulnérable à SqlInjection (malheureusement, les noms de base de données ne peuvent pas être paramétrés en sql dynamique via sp_executesql )

Donné :

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

Un seul lot peut être exécuté :

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)