SQL Query创建旧SQL条目的副本,其中两个值已更改

时间:2013-11-25 08:32:12

标签: sql sql-server

我有一个大约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应该返回给我,因为我必须更新用户的个人资料。)

1 个答案:

答案 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;
相关问题