Вы можете сделать это, присвоив номер строки как вашим существующим значениям, так и вашим новым значениям. Затем соединить два набора данных по этому номеру строки, и обновить соответственно:
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;
сколько строк вы хотите обновить ??? –
столько строк, сколько у меня есть на входе –
И таблица - это набор результатов. используя TOP n. поэтому я могу получить любое количество строк. если у меня есть 5 наборов входов, мне нужно обновить 5 верхних строк последовательно –