INSERT 和 UPDATE 的执行状态 - MS SQL Server
Posted
技术标签:
【中文标题】INSERT 和 UPDATE 的执行状态 - MS SQL Server【英文标题】:Execution status on INSERT and UPDATE - MS SQL Server 【发布时间】:2016-08-24 11:10:47 【问题描述】:我遇到了一个令人沮丧的问题。
在较低级别:我希望能够知道 proc 中的 INSERT 或 UPDATE 查询是否成功。我不是 100% 确定是否所有查询都返回了一个状态(除了 SELECT)。我知道 SQL Server 为所有存储的过程提供了一个返回类型,目前我所有的返回类型都是整数。
在中间层:在我的存储库中,我想使用实体框架来调用我存储的过程并将状态作为转换的(从 int)布尔值从过程执行返回到我的服务。
在更高的层次上:我希望能够使用从我的服务返回的布尔值向 MVC 控制器报告正在执行的任务。
在我的问题最重要的层面上,我有以下代码:
public virtual ObjectResult<int> Proc_AddApprovalProcessor(string userId, string approverId, int approvalOrder)
return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<int>(
"EXECUTE [dbo].[Proc_AddApprovalProcessor] @userId, @approverId, @approvalOrder",
new SqlParameter ParameterName = "userId", Value = userId ,
new SqlParameter ParameterName = "approverId", Value = approverId ,
new SqlParameter ParameterName = "approvalOrder", Value = approvalOrder ).FirstOrDefault();
【问题讨论】:
【参考方案1】:确保您的插入/更新存储过程以以下行结尾:
SELECT @@ROWCOUNT
然后检查返回码并检查它是否为 1(或者您希望插入/更新的行数)。
【讨论】:
也许值得一提的是,如果桌面上有触发器,这可能会产生误导。 @Evaldas Buinauskas 你确定吗?我的大多数更新/插入/删除语句都会触发存档表中的条目,而且我从来没有遇到过@@ROWCOUNT 的问题 也许它适用于更复杂的触发器,但也许你是对的。这个问题似乎回答了***.com/questions/7005225/… 很抱歉造成混乱:) 我认为这是正确的答案,因为如果更新或插入不成功,通常不会触发触发器。我可能是错的,请不要引用我。无论如何,在 C# 方面,任何不是 0 的数字都将始终转换为 true,这就是我所需要的。因此,即使@@ROWCOUNT 受到触发器的影响,它也只会增加到一个不相关的数字。我只需要一个 0 或非零数字来满足我在存储库/服务/控制器层上的逻辑。感谢你们的 cmets 伙计们 @codeshinobi。谢谢你。同时,我已经检查并可以确认由于触发器触发而插入或更新的其他行不会影响@@ROWCOUNT。如果不是这样,我的大部分生产代码都无法正常工作。您研究一次然后忘记的那些事情之一。只有当有人质疑它时,你才会突然恐慌:-)。很高兴能帮上忙,度过了愉快的一天。【参考方案2】:您可以在插入/更新查询后立即使用@@ROWCOUNT
服务器变量,通过插入/更新操作检查受影响的行数。
declare @fName varchar(50) = 'my name',
@lName varchar(50) = 'your name'
INSERT INTO myTable(fName,lName) values(@fName,@lName)
SELECT @@ROWCOUNT --> 0 - means no rows affected/nothing inserted or updated
--> 1 - means row has been inserted or updated successfully
【讨论】:
感谢您抽出时间 Sampath。唯一的问题是 print 不会向执行过程返回任何内容,因此仍会产生与不放在那里相同的结果。我会为@@ROWCOUNT 投票。 @codeshinobi 当然,没问题,感谢我的错误的正确性:)【参考方案3】:如果您正在使用事务,则必须使用以下代码返回事务计数。
返回@@TRANCOUNT;
【讨论】:
我没有使用交易,但感谢您的评论。我会收藏以供日后参考以上是关于INSERT 和 UPDATE 的执行状态 - MS SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UPSERT 执行 DELETE 和 INSERT 而不是 UPDATE (SQLite)
MariaDB 触发器在同一张表上执行 UPDATE 和 INSERT
SQLiteStatement 执行一个 SELECT / INSERT / DELETE / UPDATE
mysql远程执行select,insert into都可以,update执行不了,本机update却可以。
如何使用 VB.NET 配置 DataAdapter 以使用 Sql Server 存储过程执行 Select、Update、Insert 和 Delete 命令?