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

问题描述 投票:0回答:2

我有一个存储过程,我想审计它对许多表所做的所有更改。这段代码重复了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
sql-server identity audit
2个回答
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以使其工作。


0
投票

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

假设数据类型为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'
© www.soinside.com 2019 - 2024. All rights reserved.