Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定SQL合并语句结果_Sql_Sql Server 2008_Merge - Fatal编程技术网

确定SQL合并语句结果

确定SQL合并语句结果,sql,sql-server-2008,merge,Sql,Sql Server 2008,Merge,调用MERGE后,是否有方法确定记录是否匹配(记录是否插入或更新) 理想情况下,我希望将其输出到一个参数 编辑: 我得到了merge语句,它使用以下语句输出了在我的management studio中发生的事情: 假设我有以下合并语句: MERGE INTO TestTable as target USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' ) AS source (Guid) ON ( target.Guid = source.Guid

调用MERGE后,是否有方法确定记录是否匹配(记录是否插入或更新)

理想情况下,我希望将其输出到一个参数

编辑: 我得到了merge语句,它使用以下语句输出了在我的management studio中发生的事情: 假设我有以下合并语句:

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子句中添加一些有意义的字段,以明确行是什么 受什么行动影响:

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”。

我无法测试这一点,但您是否以保证只影响一行的方式使用它?如果是这样,
OUTPUT@SomeVariable=$action”
行得通吗?我会试试你的建议,Martin。我不太清楚我是用.NET调用来做这件事的。我很抱歉。我确实发现我可以调用:DbCommand command;…DbDataReader=command.ExecuteReader()然后查看结果表。谢谢!所以没有办法使用SqlCommand.Parameters来获取$action吗?此外,如果您知道只需要修改一行,则使用ExecuteScalar是不正确的prefered@petejamd:实际上,ExecuteScalar只应在返回一行和一列时使用!只有一个结果,即。和否-无法通过SqlCommand.Parameters集合访问$action-它既不是输入参数,也不是输出参数,而是结果集的一部分。