sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo configurar Identity_insert en un nombre de tabla pasado como variable?

Solo para respaldar la respuesta de Brad dada en los comentarios, aquí hay un MVCE de hacer la secuencia de inserción completa en una sola consulta dinámica. Según el comentario de Kris, asegúrese de que el nombre de la base de datos esté en la lista blanca, ya que la consulta es vulnerable a SqlInjection (desafortunadamente, los nombres de las bases de datos no se pueden parametrizar en sql dinámico a través de sp_executesql )

Dado:

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

Se puede ejecutar un solo lote:

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)