off identity_insert sql sql-server identity-insert

identity_insert - sql server alter table identity off



¿Cómo se verifica si IDENTITY_INSERT está configurado en ON u OFF en SQL Server? (7)

Si quieres saber sobre la variable de la sesión ... Buena pregunta, pero no puedo ver dónde esta información sería útil. En la ejecución normal para verificar una respuesta de tabla normal a un inserto, ¡esto debería funcionar!

- Si solo quieres saber si hay una inserción de identidad en una tabla determinada:

select is_identity from sys.columns where object_id = OBJECT_ID(''MyTable'', ''U'') and name = ''column_Name''

- O ... Usa esto si quieres ejecutar algo dependiendo del resultado:

if exists (select * from sys.columns where object_id = OBJECT_ID(''MyTable'', ''U'') and is_identity = 1) ... your code considering identity insert else ... code that should not run with identity insert

¡Que te diviertas!

He buscado esto, pero los hilos en los que parecía tendían a tener respuestas de personas que no entendían la pregunta.

Tome la siguiente sintaxis:

SET IDENTITY_INSERT Table1 ON

¿Cómo haces algo más como esto?

GET IDENTITY_INSERT Table1

No obstante, no quiero hacer nada de los datos en la base de datos o de la configuración para obtener esta información. ¡Gracias!


también puede usar el método ObjectProperty para determinar si una tabla tiene una identidad:

DECLARE @MyTableName nvarchar(200) SET @MyTableName = ''TestTable'' SELECT CASE OBJECTPROPERTY(OBJECT_ID(@MyTableName), ''TableHasIdentity'') WHEN 1 THEN ''has identity'' ELSE ''no identity columns'' END as HasIdentity


Como SET IDENTITY_INSERT es una sesión sensible, se administra en el nivel del búfer sin almacenar en algún lugar. Esto significa que no necesitamos verificar el estado IDENTITY_INSERT ya que nunca usamos esta palabra clave en la sesión actual.

Lo siento, no hay ayuda para esto.

Buena pregunta :)

Fuente: Aquí

Actualización Hay formas de hacer esto, también se ve en el sitio que he vinculado, OMI, es demasiado esfuerzo para ser útil.

if (select max(id) from MyTable) < (select max(id) from inserted) --Then you may be inserting a record normally BEGIN set @I = 1 --SQL wants something to happen in the "IF" side of an IF/ELSE END ELSE --You definitely have IDENTITY_INSERT on. Done as ELSE instead of the other way around so that if there is no inserted table, it will run anyway BEGIN .... Code that shouldn''t run with IDENTITY_INSERT on END


Muy buena pregunta. Tengo el mismo problema. ¿Puede ser que pueda intentar restablecer IDENTITY_INSERT usando TRY / CATCH? Por ejemplo, realiza el trabajo pero no está seguro de si el trabajo está terminado e IDENTITY_INSERT está establecido en OFF.

Por qué no lo intentas:

BEGIN TRY ... END TRY BEGIN CATCH SET IDENTITY_INSERT table OFF; END CATCH;

Además, no estoy seguro de que esto funcione correctamente, pero veo que al agregar solo SET IDENTITY_INSERT ... OFF no se devolvió el error. Por lo tanto, puede establecerlo solo en caso de que al final SET IDENTITY_INSERT ... OFF .


En resumen:

  • La solución de Nathan es la más rápida:

    SELECT OBJECTPROPERTY(OBJECT_ID(''MyTable''), ''TableHasIdentity'');

    • cuando se utiliza un contenedor API, uno puede reducir el cheque completo a solo verificar las filas. Por ejemplo, cuando se usa la propiedad HasRows SqlDataReaders C # y una construcción de consulta como:

      SELECT CASE OBJECTPROPERTY(OBJECT_ID(''MyTable''), ''TableHasIdentity'') WHEN 1 THEN ''1'' ELSE NULL END

  • La solución de Ricardo permite más flexibilidad pero requiere el nombre de identidad de la Columna

    SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(''MyTable'', ''U'') AND name = ''MyTableIdentityColumnName'';

  • La solución de Bogdan Bodanov, usando try / catch también funcionaría, pero la verificación adicional debería limitar el manejo de excepciones a los casos en que IDENTITY_INSERT is already ON for table ''MyTable''. Cannot perform SET operation for table ''MyTable''; IDENTITY_INSERT is already ON for table ''MyTable''. Cannot perform SET operation for table ''MyTable'';


Si está intentando desactivar IDENTITY_INSERT para alguna otra tabla para evitar que se produzca un error cuando quiere establecer IDENTITY_INSERT, lo siguiente también puede funcionar para usted. Como otros han dicho en este hilo, IDENTITY_INSERT es una configuración de sesión sin visibilidad directa. Sin embargo, hice el descubrimiento interesante de que SET IDENTITY_INSERT OFF no tiene errores para ninguna tabla que tenga una identidad, ya sea que IDENTITY_INSERT esté activado o no para esa tabla. Así que se me ocurrió que podía simplemente llamar a SET IDENTITY_INSERT ... OFF para cada tabla con una identidad en la base de datos. Se siente un poco como una solución de fuerza bruta, pero descubrí que el siguiente bloque SQL dinámico hizo el truco muy bien.

---- make sure IDENTITY_INSERT is OFF ---- DECLARE @cmd NVARCHAR(MAX) SET @cmd = CAST((SELECT ''SET IDENTITY_INSERT '' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + ''.'' + QUOTENAME(t.name) + '' OFF'' + CHAR(10) FROM sys.columns c JOIN sys.tables t ON t.object_id = c.object_id WHERE c.is_identity = 1 ORDER BY 1 FOR XML PATH('''')) AS NVARCHAR(MAX)) EXEC sp_executesql @cmd


Puede descubrir si identity_insert está activado o no y, de ser así, para qué tabla usar el código siguiente.

declare @tableWithIdentity varchar(max) = ''''; SET IDENTITY_INSERT ExampleTable ON begin try create table #identityCheck (id int identity(1,1)) SET IDENTITY_INSERT #identityCheck ON drop table #identityCheck end try begin catch declare @msg varchar(max) = error_message() set @tableWithIdentity= @msg; set @tableWithIdentity = SUBSTRING(@tableWithIdentity,charindex('''''''',@tableWithIdentity,1)+1, 10000) set @tableWithIdentity = SUBSTRING(@tableWithIdentity,1, charindex('''''''',@tableWithIdentity,1)-1) print @msg; drop table #identityCheck end catch if @tableWithIdentity<>'''' begin print (''Name of table with Identity_Insert set to ON: '' + @tableWithIdentity) end else begin print ''No table currently has Identity Insert Set to ON'' end