【问题标题】:Determining SQL MERGE statement result确定 SQL MERGE 语句结果
【发布时间】:2011-02-26 02:36:49
【问题描述】:

有没有办法在调用 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 @SomeVariable = $action"; 工作吗?
  • 我会试试你的建议马丁。我不够清楚,因为我正在使用 .NET 调用来执行此操作。我很抱歉。我确实发现我可以调用:DbCommand 命令; ... DbDataReader reader = command.ExecuteReader() 并查看结果表。

标签: sql sql-server-2008 merge


【解决方案1】:

您可以做的是创建一个临时表(或表变量)并将您的输出发送到那里 - 在您的 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

更新:啊,好吧,所以你想从 .NET 调用它!好吧,在这种情况下,只需在您的 SqlCommand 对象上使用 .ExecuteReader() 方法调用它 - 您使用 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”。

【讨论】:

  • 谢谢!那么有没有办法使用SqlCommand.Parameters来获取$action呢?
  • 另外,如果你知道你只会修改一行,最好使用 ExecuteScalar
  • @petejamd:实际上,ExecuteScalar 应该只在你得到一行一列的情况下使用!只是一个结果。不 - 不能通过 SqlCommand.Parameters 集合访问 $action - 它既不是输入参数也不是输出参数,而是结果集的一部分。
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2023-03-24
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多