sql - 确定 SQL MERGE 语句结果

标签 sql sql-server-2008 merge

有没有办法在调用 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/

相关文章:

asp.net - 将 ASP.NET 成员资格数据库迁移到 SQL Azure

c# - 加载 XML 文件

r - 合并两个公共(public)列上的多个数据框

sql - 将日期参数传递给内联表值函数很慢

svn - 在被认为有害的 SVN 子目录上提交和合并?

svn - 如何将 kdiff3 设置为 SVN 的合并工具

php - 在插入之前插入单引号

MySQL - 如何快速插入百万行?

SQL 查询查找金融交易表中最大的 "Drawdown"

sql - MySQL:为用户获得最高分