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)
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)
尝试这个:
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)
| 归档时间: |
|
| 查看次数: |
10356 次 |
| 最近记录: |