2015-10-21 64 views
0

我有一個存儲過程,我想審覈它對多個表所做的所有更改。這一點代碼在SP下重複,但具有不同的表名。一旦這段腳本完成,我將臨時表的內容複製到我的審計表中,該表很好地工作。從動態生成的臨時表中刪除Identity_Insert

我有一個錶帶來這個消息的問題:表'#MyTempTable'中的標識列的顯式值只能在使用列列表並且IDENTITY_INSERT爲ON時指定。

我很懶,我不想指定所有的列名。有沒有辦法在創建後從臨時表中刪除身份?

--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 
 
\t series_nm = @newseries, 
 
\t UPDATED_DT = GetDate() 
 

 
OUTPUT deleted.* INTO #MyTempTable 
 

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

 

 
--Copy Contents from Temp table to Audit Table

回答

0

我花了一天時間在研究這個,但現在終於找到了一個解決方案。簡單地說,當我創建它時,首先創建它沒有身份。我通過創建一個動態腳本來創建基於另一個的臨時表,並且不添加標識。

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;

我也改變了臨時表的全局臨時表爲它工作。