gpt4 book ai didi

c# - 是否可以在存储过程的输出变量中使用 MERGE 语句的 $action?

转载 作者:太空狗 更新时间:2023-10-30 00:35:26 25 4
gpt4 key购买 nike

我有一个存储过程,可以使用 MERGE statement 更新现有的或插入单个记录(我使用 MERGE TOP(1) ..)在 SQL Server 2008 R2 中。我使用 MERGE 的 OUTPUT 子句发出 $action 的值以查看采取了什么操作(INSERT、UPDATE、DELETE、“空白”)。

但是,当我从 C# 程序调用我的 SP 时,我被迫执行一个读取器 (DbCommand.ExecuteReader()) 并循环一次以获取 $action 值...

我的问题是,OUTPUT $action 能否以某种方式附加到 SP 输出参数,这将使我能够仅执行 DbCmmand.ExecuteNonQuery() 并检查输出参数?这将使我不必实例化阅读器...

顺便说一句,我在循环中执行此调用,因此不必实例化读取器会更快一些(我希望如此)

最佳答案

供讨论的样本表

create table t1 (id int identity primary key, other int);
insert t1 select 2;

此 TSQL 最后执行最终选择,最终将作为 ExecuteNonQuery 的结果

set nocount on
declare @tmp table (action sysname)
;
with new(id,other) as (select 1,4)
merge top(1)
into t1
using new
on t1.id = new.id
when matched then update set other = new.id
when not matched then insert values (other)
output $action
into @tmp
;
set nocount off
select action from @tmp

这对 TOP(1) 很有效,因为它在 @tmp 中只产生一行,但下面的例子显示了当有多个记录时会发生什么,从上面继续

set nocount on
declare @tmp table (action sysname)
;
merge
into t1
using (values(1,4),(2,5)) new(id,other)
on t1.id = new.id
when matched then update set other = new.id
when not matched then insert values (other)
output $action
into @tmp
;
set nocount off
select action from @tmp

输出:

action
======
UPDATE
INSERT
  • 额外的临时表变量和 SP 的 SELECT 语句是否对性能有很大影响?

这个可以忽略不计,你可以忽略它。

  • 我是否必须在事务中“包装”2(我的应用程序是多线程的)?

没有。插入 @tmp 是原子的,选择来自特定于 session 的临时表(没有任何东西可以干扰它)

关于c# - 是否可以在存储过程的输出变量中使用 MERGE 语句的 $action?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com