C# 在同一存储过程中选择和更新,并使用选择的结果更新某些值
有类似的吗C# 在同一存储过程中选择和更新,并使用选择的结果更新某些值,c#,asp.net,sql-server,stored-procedures,C#,Asp.net,Sql Server,Stored Procedures,有类似的吗 select Column_n from table1; update table2 set column_m where column_a=Column_n ; 可以在同一个存储过程中写入您可以直接使用JOIN进行更新,如下所示: UPDATE t2 SET t2.column_m = ... FROM table2 AS t2 INNER JOIN table1 AS t1 ON t1.column_n = t2.column_a; 您可以将它放在存储过程中。SQL Ser
select Column_n from table1;
update table2 set column_m where column_a=Column_n ;
可以在同一个存储过程中写入您可以直接使用JOIN进行更新,如下所示:
UPDATE t2
SET t2.column_m = ...
FROM table2 AS t2
INNER JOIN table1 AS t1 ON t1.column_n = t2.column_a;
您可以将它放在存储过程中。SQL Server有很多选项,可以使用其他表中的数据更新一个表。下面,您可以找到以下几种解决方案:
CREATE TABLE TableX
(
ID INT NOT NULL,
Col2 VARCHAR(10)
);
INSERT TableX (ID)
SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3;
CREATE TABLE TableY
(
ID INT NOT NULL,
Col2 VARCHAR(10)
);
INSERT TableY (ID,Col2)
SELECT 1,'A' UNION ALL SELECT 2,'B' UNION ALL SELECT 4,'D';
解决方案:
-- Solution #1
UPDATE TableX SET Col2 = NULL;
UPDATE x
SET Col2 = y.Col2
FROM TableX x INNER JOIN TableY y ON x.ID = y.ID;
SELECT * FROM TableX;
/*
ID Col2
----------- ----
1 A
2 B
3 NULL
*/
-- Solution #2
UPDATE TableX SET Col2 = NULL;
UPDATE TableX
SET Col2 =
(
SELECT y.Col2
FROM TableY y
WHERE TableX.ID = y.ID
)
SELECT * FROM TableX;
/*
ID Col2
----------- ----
1 A
2 B
3 NULL
*/
-- Solution #3
UPDATE TableX SET Col2 = NULL;
WITH UpdateTableX
AS
(
SELECT x.Col2 AS TargetCol2,
y.Col2 AS SourceCol2
FROM TableX x INNER JOIN TableY y ON x.ID = y.ID
)
UPDATE UpdateTableX
SET TargetCol2 = SourceCol2
SELECT * FROM TableX;
/*
ID Col2
----------- ----
1 A
2 B
3 NULL
*/
-- Solution #4 (SQL2008+)
UPDATE TableX SET Col2 = NULL;
MERGE INTO TableX x
USING TableY y ON x.ID = y.ID
WHEN MATCHED THEN
UPDATE SET Col2 = y.Col2;
SELECT * FROM TableX;
/*
ID Col2
----------- ----
1 A
2 B
3 NULL
*/
现在,若对于目标表,一行可以匹配源表中的多行
然后您可能会遇到问题,因为某些解决方案可能会成为不安全的解决方案1和3
示例:在源表TableY中插入另一行
INSERT TableY (ID,Col2)
SELECT 1,'AA'
现在,对于源表中ID=1的一行,有两行ID=1{1,'A'}和{1,'AA'}。在这种情况下,即使这些更新不安全,解决方案1或3也将成功执行:
UPDATE TableX SET Col2 = NULL;
UPDATE x
SET Col2 = y.Col2
FROM TableX x INNER JOIN TableY y ON x.ID = y.ID;
SELECT * FROM TableX;
/*
ID Col2
----------- ----------
1 A <-- In my test, SQL Server selected "first" row with ID=1 from source table (TableY) which has 2 rows with ID=1 ({1,'A'} and {1,'AA'})
2 B
3 NULL
*/
你可以这样做
声明@Var=varchar50
从表1中选择@Var=Column
更新表2设置列\u m=newValue,其中列\u a=@Var
TRUNCATE TABLE TableY;
INSERT TableY (ID,Col2)
SELECT 1,'AA' UNION ALL SELECT 2,'B' UNION ALL SELECT 4,'D';
INSERT TableY (ID,Col2)
SELECT 1,'A';
UPDATE TableX SET Col2 = NULL;
UPDATE x
SET Col2 = y.Col2
FROM TableX x INNER JOIN TableY y ON x.ID = y.ID;
SELECT * FROM TableX;
/*
ID Col2
----------- ----------
1 AA <-- The same UPDATE gives different results: 'AA' instead of 'A'
2 B
3 NULL
*/
Solution #2:
Msg 512, Level 16, State 1, Line 17
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
Solution #4:
Msg 8672, Level 16, State 1, Line 55
The MERGE statement attempted to UPDATE or DELETE the same row more than once. This happens when a target row matches more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the target table multiple times. Refine the ON clause to ensure a target row matches at most one source row, or use the GROUP BY clause to group the source rows.
-- Solution #2
UPDATE TableX SET Col2 = NULL;
UPDATE TableX
SET Col2 =
(
SELECT MAX(y.Col2) -- or MIN or something else
FROM TableY y
WHERE TableX.ID = y.ID
)
-- Solution #4 (SQL2008+)
UPDATE TableX SET Col2 = NULL;
MERGE INTO TableX x
USING
(
SELECT a.ID, MAX(a.Col2) AS Col2 -- or MIN or something else
FROM TableY a
GROUP BY a.ID
) y ON x.ID = y.ID
WHEN MATCHED THEN
UPDATE SET Col2 = y.Col2;