有没有办法在调用 MERGE 后确定记录是否匹配(记录是否插入或更新)?
理想情况下,我想将其输出到参数。
编辑:
我有使用以下语句输出在我的管理工作室中发生的事情的合并语句:
假设我有以下合并语句:
MERGE INTO TestTable as target
USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' )
AS source (Guid)
ON ( target.Guid = source.Guid )
WHEN MATCHED THEN
UPDATE SET Test_Column = NULL
WHEN NOT MATCHED THEN
INSERT (Guid, Test_Column) VALUES ('00D81CB4EA0842EF9E158BB8FEC48A1E', NULL)
OUTPUT $action;
我正在尝试使用参数来获取 '$action' 输出。
最佳答案
您可以做的是创建一个临时表(或表变量)并将您的输出发送到那里 - 在您的 OUTPUT 子句中添加一些有意义的字段以明确行是
受什么 Action 影响:
DECLARE @OutputTable TABLE (Guid UNIQUEIDENTIFIER, Action VARCHAR(100))
MERGE INTO TestTable as target
USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' )
AS source (Guid)
ON ( target.Guid = source.Guid )
WHEN MATCHED THEN
UPDATE SET Test_Column = NULL
WHEN NOT MATCHED THEN
INSERT (Guid, Test_Column) VALUES ('00D81CB4EA0842EF9E158BB8FEC48A1E', NULL)
OUTPUT INSERTED.Guid, $action INTO @OutputTable
SELECT
Guid, Action
FROM
@OutputTable
更新:啊,好吧,所以你想从 .NET 调用它!那么,在这种情况下,只需使用
.ExecuteReader()
调用它即可。您的方法 SqlCommand
object - 你使用 OUTPUT...
输出的东西将作为结果集返回给 .NET 调用方 - 您可以循环访问:using(SqlCommand cmd = new SqlCommand(mergeStmt, connection))
{
connection.Open();
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
var outputAction = rdr.GetValue(0);
}
rdr.Close();
}
connection.Close();
}
您应该从该数据读取器中取回生成的“$action”。
关于sql - 确定 SQL MERGE 语句结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2945765/