【问题标题】:Removing Identity_Insert from a Temp Table that is Generated Dynamically从动态生成的临时表中删除 Identity_Insert
【发布时间】:2016-01-20 04:58:22
【问题描述】:

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

我的一个表有问题,它会返回此消息:表“#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 
	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


    【解决方案1】:

    我花了一天多的时间研究这个问题,但现在终于找到了解决方案。只需在我创建它时,首先在没有身份的情况下创建它。我通过创建一个动态脚本来基于另一个创建临时表而不添加身份来做到这一点。

    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;

    我还将临时表更改为全局临时表以使其正常工作。

    【讨论】:

      【解决方案2】:

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

      假设数据类型为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,两者都需要额外的努力。
      • 当然,我只是将其添加为供将来查看此内容的人们的一个选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多