从动态生成的临时表中删除Identity_Insert

时间:2015-10-21 09:08:23

标签: sql-server identity audit

我有一个存储过程,我想审核它对许多表所做的所有更改。这段代码重复了SP,但具有不同的表名。完成该脚本后,我将临时表的内容复制到我的审计表中,该表运行良好。

我遇到一个带有此消息的表的问题:只有在使用列列表并且IDENTITY_INSERT为ON时,才能指定表'#MyTempTable'中标识列的显式值。

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

--Create Temp Audit Table
IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL drop table #MyTempTable; 
select top 0 * into #MyTempTable from TabletoAudit


--Do changes and record into TempTable
UPDATE TabletoAudit
SET 
	series_nm = @newseries,
	UPDATED_DT = GetDate()

OUTPUT deleted.* INTO #MyTempTable

WHERE 
	mach_type_cd = @mtype
	AND 
	brand_id = @brand
	AND 
	series_nm = @oldseries


--Copy Contents from Temp table to Audit Table

2 个答案:

答案 0 :(得分:0)

我花了一天时间研究这个,但现在终于找到了解决方案。简单地说,当我创建它时,首先创建它而不使用Identity。我这样做是通过创建一个动态脚本来创建一个基于另一个的临时表并且不添加标识。



SET NOCOUNT ON;
IF OBJECT_ID('tempdb..##MyTempTable') IS NOT NULL drop table ##INSERTED7; 
SET NOCOUNT ON;


DECLARE @sql NVARCHAR(MAX);
DECLARE @CreateSQL NVARCHAR(MAX);
SET @sql = N'SELECT * FROM TabletoAudit;';
SELECT @CreateSQL = 'CREATE TABLE ##MyTempTable(';
SELECT 
    @CreateSQL = @CreateSQL + CASE column_ordinal 
        WHEN 1 THEN '' ELSE ',' END 
        + name + ' ' + system_type_name + CASE is_nullable 
        WHEN 0 THEN ' not null' ELSE '' END
FROM 
    sys.dm_exec_describe_first_result_set (@sql, NULL, 0) AS f
ORDER BY column_ordinal;
SELECT @CreateSQL = @CreateSQL + ');';


EXEC sp_executesql @CreateSQL;
SET NOCOUNT OFF;




我还将Temp Table更改为Global Temp Table以使其正常工作。

答案 1 :(得分:0)

如果标识列是第一列(通常是第一列),那么您还可以:

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

DrawerOpen