确定SQL合并语句结果
调用MERGE后,是否有方法确定记录是否匹配(记录是否插入或更新) 理想情况下,我希望将其输出到一个参数 编辑: 我得到了merge语句,它使用以下语句输出了在我的management studio中发生的事情: 假设我有以下合并语句:确定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 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-它既不是输入参数,也不是输出参数,而是结果集的一部分。