1.查询某个表的某列是否为标识列(自增列)
SELECT
is_identity
FROM sys.columns
WHERE
object_id = object_id('TableName')
AND name = 'ColumnName'
is_identity为1时,表示该列为标识列,为0是表示该列不是标识列。注意判断当ColumnName不存在时,查询结果为空。
2.允许显式插入标识列的值
默认情况下,当一列为标识列时,插入数据的SQL无需为该列赋值,当有需要显式插入标识列的值时,需要进行设置。
--允许显式插入标识列
set identity_insert TableName on
--不允许显式插入标识列
set identity_insert TableName off
注意①:当使用SQL进行显式插入标识列时,SQL语句中需要包含列名单,不能直接只写Values,否则会报错。
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TableName'中的标识列指定显式值。
注意②:设置成允许显式插入标识列后,后续所有插入SQL都需要指定标识列的值,否则插入语句会报错,所以不需要显式插入后,需要及时关闭该功能。
当 IDENTITY_INSERT 设置为 ON 或某个复制用户向 NOT FOR REPLICATION 标识列中插入内容时,
必须为表 'TableName' 中的标识列指定显式值。
注意③:允许显式插入标识列功能仅当前Connection有效,所以请将开启语句放到插入语句中统一执行。否则新连接仍会报错无法插入。
注意④:IDENTITY_INSERT默认值为off,且同一时间只有一个表能被设置为on,当另一个表设置为on后,前一个设置为on的表会自动切换至off状态。所以多表的异步操作时要注意这个问题,最好是同步语法。