您可以通過爲現有值和新值分配行號來完成此操作。然後加入該行數的兩個數據集,並相應地更新:
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