pet*_*amd 4 sql merge sql-server-2008
在调用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;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用参数来获取'$ action'输出.
你可以做的是创建一个临时表(或一个表变量)并在那里发送输出 - 在你的OUTPUT子句中添加一些有意义的字段,以明确哪些行受到了什么操作的影响:
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
Run Code Online (Sandbox Code Playgroud)
更新:啊,好的,所以你想从.NET调用它!那么,在这种情况下,只需使用对象.ExecuteReader()上的方法调用它SqlCommand- 您输出的内容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();
}
Run Code Online (Sandbox Code Playgroud)
您应该从该数据读取器返回结果"$ action".