您可以通过为现有值和新值分配行号来完成此操作。然后加入该行数的两个数据集,并相应地更新:
WITH YourTableRanked AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
FROM YourTable AS t
), NewValues AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY Name)
FROM (VALUES
('yJ','ht43',34),
('rt','fd43',36),
('hg','hgd4',40),
('ui','udg6',28)
) AS t (Name, Address, Age)
)
UPDATE T
SET Name = v.Name,
Address = v.Address,
Age = v.Age
FROM YourTableRanked AS t
INNER JOIN NewValues AS v
ON v.RowNum = t.RowNum;
值得一提的是,任何种类的TOP
,或排名操作或者不有效的语法,或在不存在的不是特别有用ORDER BY
条款。因此,当您引用“顺序”更新行时,为了顺序具有任何意义,您需要定义此序列的顺序。在我发布的查询中,我已经在您的新值中订购了Name
,为您的现有数据订购了ID
,但您可能希望对此进行更改以满足您的需求。
完整的例子:
CREATE TABLE #T (ID INT, Name VARCHAR(2), Address VARCHAR(5), Age INT);
INSERT #T (id, name, address, age)
VALUES
(1, 'as', 're3', 20),
(2, 'dg', 'ht5', 21),
(3, 'hf', 'ujy6', 23),
(4, 'ku', 'tr5', 25);
WITH YourTableRanked AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
FROM #t AS t
), NewValues AS
( SELECT t.*,
RowNum = ROW_NUMBER() OVER(ORDER BY Name)
FROM (VALUES
('yJ','ht43',34),
('rt','fd43',36),
('hg','hgd4',40),
('ui','udg6',28)
) AS t (Name, Address, Age)
)
UPDATE T
SET Name = v.Name,
Address = v.Address,
Age = v.Age
FROM YourTableRanked AS t
INNER JOIN NewValues AS v
ON v.RowNum = t.RowNum;
SELECT *
FROM #T;
DROP TABLE #T;
你要多少行更新??? – 2014-10-29 07:34:25
尽可能多的行我输入 – 2014-10-29 07:35:25
而表是结果集。使用TOP n。所以我可以检索任意数量的行。如果我有5组输入,我需要依次更新前5行 – 2014-10-29 07:37:06