Sql server 从动态生成的临时表中删除标识\u Insert

Sql server 从动态生成的临时表中删除标识\u Insert,sql-server,identity,audit,Sql Server,Identity,Audit,我有一个存储过程,我想审核它对许多表所做的所有更改。这段代码在SP中重复,但表名不同。一旦脚本完成,我就把临时表的内容复制到我的审计表中,这很好 我对一个返回此消息的表有一个问题:只有在使用列列表且启用identity_INSERT时,才能为表“MyTestable”中的identity列指定显式值 我很懒,我不想指定所有的列名。在我创建临时表之后,有没有办法从临时表中删除该标识 -创建临时审核表 如果对象_ID'tempdb..myentitable'不是NULL,则删除表myentitab

我有一个存储过程,我想审核它对许多表所做的所有更改。这段代码在SP中重复,但表名不同。一旦脚本完成,我就把临时表的内容复制到我的审计表中,这很好

我对一个返回此消息的表有一个问题:只有在使用列列表且启用identity_INSERT时,才能为表“MyTestable”中的identity列指定显式值

我很懒,我不想指定所有的列名。在我创建临时表之后,有没有办法从临时表中删除该标识

-创建临时审核表 如果对象_ID'tempdb..myentitable'不是NULL,则删除表myentitable; 从表格中选择“我的诱惑”中的前0*项进行审核 -进行更改并记录到诱人的 更新TabletoAudit 设置 series_nm=@newseries, 更新的\u DT=GetDate 输出已删除。*到MyTestable中 哪里 马赫数类型cd=@mtype 和 品牌标识=@brand 和 系列_nm=@oldseries
-将内容从临时表复制到审计表我花了一天的时间研究这个问题,但现在终于找到了解决方案。简单地说,当我创建它时,首先创建它而不使用身份。我通过创建一个动态脚本来创建一个基于另一个临时表的临时表,而不添加标识

不计数; 如果对象_ID'tempdb..mytentable'不是NULL,则删除插入的表7; 不计数; 声明@sql NVARCHARMAX; 声明@CreateSQL NVARCHARMAX; 设置@sql=N'SELECT*fromtabletoaudit;'; 选择@CreateSQL='createtablemytentable'; 选择 @CreateSQL=@CreateSQL+案例列顺序 当1时,则结束 +名称+系统类型+名称+大小写可为空 当0时,则“不为null”,否则结束 从…起 sys.dm_exec_description_first_result_set@sql,NULL,0为f 按列顺序排列; 选择@CreateSQL=@CreateSQL+';'; EXEC sp_executesql@CreateSQL;
不计数 如果标识列通常是第一列,则您还可以:

假设数据类型为INT,列名为originalid

SELECT top 0 CONVERT(INT,0)myid,* into #MyTempTable from TabletoAudit
ALTER TABLE #MyTempTable DROP COLUMN originalid
EXEC tempdb.sys.sp_rename N'#MyTempTable.myid', N'originalid', N'COLUMN'

如果包含列名而不是使用*,则可以跳过ALTER和EXEC行。是的,我可以这样做,但我将来需要以这种方式维护字段,或者动态构建sql,这两个都需要额外的努力。当然,我只是添加了这一行,作为将来关注此问题的人的一个选项。