如何复制除标识列以外的每一列的行(SQL Server 2005)

Set*_*eth 9 sql sql-server sql-server-2005

我的代码:

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
Run Code Online (Sandbox Code Playgroud)

错误是:

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.
Run Code Online (Sandbox Code Playgroud)

我确实做了

SET IDENTITY_INSERT CTABLE OFF
GO
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 9

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, 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;
Run Code Online (Sandbox Code Playgroud)

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

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

PRINT @sql;
-- exec sp_executeSQL @sql;
Run Code Online (Sandbox Code Playgroud)


Cha*_*ndu 5

尝试这个:

SELECT * INTO #t FROM CTABLE WHERE CID = @cid
ALTER TABLE #t
DROP COLUMN CID

INSERT CTABLE --Notice that INTO is removed here.
SELECT top(1) * FROM #t
DROP TABLE #t
Run Code Online (Sandbox Code Playgroud)

测试脚本(在 SQL 2005 中测试):

CREATE TABLE #TestIDNT
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    TITLE   VARCHAR(20)
)

INSERT #TestIDNT
SELECT 'Cybenate'
Run Code Online (Sandbox Code Playgroud)

  • `INTO` 只是一个可选关键字,删除它没有任何效果。 (2认同)