小弟有两个问题需要请教
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如果是显式值的话,必须要写全明确字段名,这样才能正确插入!