我正在尝试学习如何使用MERGE运算符.以下代码正确编译:
ALTER PROCEDURE moto.procPM_UpdateLines
@LineId As Int = null,
@LineName As Varchar(100),
@DeleteMe As Bit = 0
AS
BEGIN
MERGE moto.tblPMLine AS line
USING (SELECT LineId, LineName FROM moto.tblPMLine) AS existsLine
ON line.LineId = existsLine.LineId
WHEN MATCHED AND @DeleteMe = 1 THEN DELETE
WHEN MATCHED AND @DeleteMe = 0 THEN UPDATE SET line.LineName = @LineName
WHEN NOT MATCHED THEN INSERT(LineName) VALUES(@LineName);
END
GO
Run Code Online (Sandbox Code Playgroud)
我知道这是一个非常简单的过程,但由于某种原因,当我使用以下命令时它似乎没有生成任何条目.
execute moto.procPM_UpdateLines null, 'First test', 0
Run Code Online (Sandbox Code Playgroud)
有没有办法让我知道它遵循哪个选项,如果有的话?
以前的存储过程已修复
MERGE INTO moto.tblPMLine AS T
USING (SELECT @LineId as LineId, @LineName as LineName) AS S
ON T.LineId = S.LineId
WHEN MATCHED AND @DeleteMe = 0 THEN --UPDATE
UPDATE SET LineName = @LineName
WHEN MATCHED AND @DeleteMe = 1 THEN --DELETE
DELETE
WHEN NOT MATCHED THEN--INSERT
INSERT (LineName) VALUES (@LineName)
OUTPUT $action AS ChangesMade;
Run Code Online (Sandbox Code Playgroud)
现在它插入,更新和删除,以及返回输出.
mar*_*c_s 11
您可以结合使用MERGE
该OUTPUT
子句来获取MERGE
正在进行的某种"活动报告"(或调试"打印报表")- 这可能会帮助您了解出现问题的原因.
请参阅Adam Machanic的优秀博客文章OUTPUT博士或:我如何学会停止担心和喜欢MERGE,这表明该技术以及如何使用它
基本上它归结为使用OUTPUT
带有MERGE
语句的子句来获取有关正在发生的事情的信息 - 大致类似于:
MERGE INTO ......
WHEN MATCHED THEN
.......
WHEN NOT MATCHED THEN
......
WHEN NOT MATCHED BY SOURCE THEN
........
OUTPUT
$action AS dml_action,
inserted.x AS new_x,
deleted.x AS old_x,
inserted.y AS new_y,
deleted.y AS old_y;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6151 次 |
最近记录: |