加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 如何使用除标识列之外的每一列复制行(SQL Server

发布时间:2020-12-12 06:29:26 所属栏目:MsSql教程 来源:网络整理
导读:我的代码: SELECT * INTO #t FROM CTABLE WHERE CID = @cid --get data,put into a temp tableALTER TABLE #tDROP COLUMN CID -- remove primary key column CIDINSERT INTO CTABLE SELECT * FROM #t -- insert record to tableDROP TABLE #t -- drop temp t
我的代码:
SELECT * INTO #t FROM CTABLE WHERE CID = @cid   --get data,put into a temp table


ALTER TABLE #t
DROP COLUMN CID       -- remove primary key column CID


INSERT INTO CTABLE SELECT * FROM #t   -- insert record to table
DROP TABLE #t                                -- drop temp table

错误是:

Msg 8101,An explicit value for the identity column in table 'CTABLE' can only 
be specified when a column list is used and IDENTITY_INSERT is ON.

而我确实设定了

SET IDENTITY_INSERT CTABLE OFF
GO

解决方法

DECLARE 
    @cid INT,@o   INT,@t   NVARCHAR(255),@c   NVARCHAR(MAX),@sql NVARCHAR(MAX);

SELECT
    @cid = 10,@t   = N'dbo.CTABLE',@o   = OBJECT_ID(@t);

SELECT @c = COALESCE(@c,'') + ',' + QUOTENAME(name)
    FROM sys.columns
    WHERE [object_id] = @o
    AND is_identity = 0;

SELECT @c = STUFF(@c,1,'');

SET @sql = 'SELECT ' + @c + ' INTO #t 
    FROM ' + @t + ' WHERE CID = ' + RTRIM(@cid) + ';

    INSERT ' + @t + '('+ @c + ') 
    SELECT ' + @c + ' FROM #t;' 

PRINT @sql;
-- exec sp_executeSQL @sql;

但是,构建以下SQL并完全避免#temp表似乎要容易得多:

SET @sql = 'INSERT ' + @t + '(' + @c + ') 
    SELECT ' + @c + ' FROM ' + @t + '
    WHERE CID = ' + RTRIM(@cid);

PRINT @sql;
-- exec sp_executeSQL @sql;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读