当前位置: 代码迷 >> Sql Server >> 关于INDETITY_INSERT的有关问题
  详细解决方案

关于INDETITY_INSERT的有关问题

热度:45   发布时间:2016-04-24 09:26:22.0
关于INDETITY_INSERT的问题
本帖最后由 h379428449 于 2015-01-21 10:32:04 编辑
小弟有两个问题需要请教
1:我需要在表中的标识列插入显式值,所以需要set IDENTITY_INSERT table on,但是因为我的表名称是一个变量,所以我把SQL语句写成了

declare @tablename varchar(300)
              ,@sqlSe varchar(300)
set @tablename = 'myTable'
set @sqlSe = 'set IDENTITY_INSERT '+@tablename+' ON'
exec(@sqlSe)
         insert into myTable(id,name) select * from sourceTable
set IDENTITY_INSERT myTable off

但是上述的执行结果是错误“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'myTable' 中的标识列插入显式值。‘如果我把set IDENTITY_INSERT设置成静态语句就能够执行成功,这个是怎么回事?

2:因为只有一个表才能将IDENTITY_INSERT设置为ON,有没有函数能够获取这个表的IDENTITY_INSERT的状态和哪个表的IDENTITY_INSERT是ON的?
谢谢
------解决思路----------------------
把 INSERT 也拼到动态语句中一起执行。
EXEC(@sqlSe) 可以看成一个独立的子会话,子会话中的IDENTITY_INSERT设置改变不影响父会话。
------解决思路----------------------
把执行语句用一个字符串加起来一起执行

USE tempdb
GO
CREATE TABLE t(ID INT IDENTITY,NAME NVARCHAR(50))
GO
DECLARE @TabName sysname='t'

EXEC('SET IDENTITY_INSERT '+@TabName+' ON; INSERT INTO t(ID,Name) SELECT 1,N''Roy'';SET IDENTITY_INSERT '+@TabName+' OFF;' );

------解决思路----------------------

-- 这里必须写出具体的列名,不能写 * 
set IDENTITY_INSERT tablename ON

insert into a(col1,col2,....) select col1 , col2 ... from b where ...   -- 对的
insert into a select * from b where ... -- 错的。


------解决思路----------------------
set IDENTITY_INSERT tablename ON跟动态语句要拼在一起
------解决思路----------------------
ID如果是显式值的话,必须要写全明确字段名,这样才能正确插入!
  相关解决方案