我有一个大约50到60个cols(并且正在计数)的表,我想知道我是否可以为INSERT创建一个通用查询... SELECT来复制一行,但是改变了两个col。
更具体地说,我想从表configs
中获取一个全局配置,并将其插入到表configs
中,其中标记global
设置为false
,新id
自动增量值。
STH。像:
INSERT INTO configs
(SELECT TOP 1 * FROM configs WHERE global=1)
UPDATE global=0, id=?
(当然新的自动增量ID应该返回给我,因为我必须更新用户的个人资料。)
答案 0 :(得分:1)
这是一个功能齐全的解决方案,演示了它的工作原理。我假设您在存储过程中完成此操作。我基本上将当前的global = 1行克隆到临时表中,然后删除IDENTITY列,以便您可以使用SELECT *重新插入记录。通过使用SELECT *,只要列数增加,就不必更新它。
-- setup demonstration with two sample columns of data
CREATE TABLE #configs (ID INT IDENTITY(100,1), [Global] INT, ColA CHAR(2), ColB VARCHAR(2));
-- fill with values
SET NOCOUNT ON;
INSERT #configs VALUES (1,'AA','BB');
INSERT #configs VALUES (1,'CC','DD');
INSERT #configs VALUES (1,'EF','GH');
SET NOCOUNT OFF;
-- This is the target ID we are working with
DECLARE @CloneID INT = 100;
-- Examine the ID
SELECT * FROM #configs WHERE ID=@CloneID;
-- This work should be completed in a transaction
BEGIN TRANSACTION;
-- copy current "global=1" record into a temp table and change its value to 0
SELECT * INTO #temp FROM #configs WHERE ID=@CloneID AND [Global]=1;
UPDATE #temp SET [Global]=0;
-- drop off the IDENTITY column so we can select it into main table again
ALTER TABLE #temp DROP COLUMN [ID];
-- copy the old "global=1" record back into main table, its value has been changed
INSERT #configs SELECT * FROM #temp;
COMMIT;
-- Examine
SELECT * FROM #configs;
-- cleanup
DROP TABLE #temp;
DROP TABLE #configs;