Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso definir identity_insert em um tablename passado como uma variável


Apenas para fazer backup da resposta de Brad dada nos comentários, aqui está um MVCE de fazer toda a sequência de inserção em uma única consulta dinâmica. De acordo com o comentário de Kris, certifique-se de que o nome do banco de dados esteja na lista branca, pois a consulta é vulnerável a SqlInjection (infelizmente, os nomes do banco de dados não podem ser parametrizados em sql dinâmico via sp_executesql )

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

Um único lote pode ser executado:
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)