返回从存储过程插入的记录数的可靠方法是什么?
本文关键字:方法 是什么 记录 存储过程 插入 返回 | 更新日期: 2023-09-27 18:12:13
我在该表上使用INSERT Trigger。一旦触发器被执行(如果满足一个条件,它会更新表),这就是问题所在。
int records = sc.ExecuteNonQuery(); // works ok if trigger does not update the record
如果我将SET NOCOUNT ON;
留在存储过程本身中,上面的代码总是返回-1。如果我删除它,我得到正确的结果,但如果触发器更新记录,那么错误的结果。有时会得到10或不同的数字。我的触发器是这样的
UPDATE students
SET status = 'Inactive'
FROM Inserted i
INNER JOIN students T2
ON i.sname = T2.sname
AND i.id <> t2.id
这意味着它可以返回多个记录(特别是在测试用例中)。谁能告诉我怎么解药?如果解决问题或任何更好的方法,我愿意使用函数。
感谢添加插入SP
CREATE PROCEDURE sp_InsertSudent
-- Add the parameters for the stored procedure here
@student_name varchar(25) = null,
@status varchar(20) = null,
@renew varchar(15) = null,
@edate datetime = null
AS
BEGIN
--SET NOCOUNT ON;
insert into students VALUES(@student_name,@status,@renew,@edate)
END
GO
注意:我正在寻找一个错误,因为字段是从Excel中选择的。如果任何字段格式错误或为空,Insert SP将产生错误。我必须把这个错误传达给用户。
添加实际SP
所以整个问题都在SP中。如果我删除它,一切都很好。这是我的实际SP
UPDATE CustomerTbl
SET [Account Status] = 'Inactive',
[End Date] = DateAdd(day,-1,[Supplier End Date]),
[EnrollmentStatus] = 'Waiting'
WHERE OET.[Account No] = (SELECT [Account No] FROM CustomerTbl WHERE id = @@identity)
AND id <> @@identity
逻辑与上面相同,但表述不同。ExecuteNonQuery输出这个触发器的结果,而不是实际的存储过程,那么它是什么呢?可以以某种方式抑制它的输出
我会将Try Catch块添加到进程中,如果成功则返回1,如果不成功则返回0。
我还将调整触发器,使其更有效,只更改那些处于活动状态并满足其他标准的状态。
UPDATE students
SET status = 'Inactive'
FROM Inserted i
INNER JOIN students T2
ON i.sname = T2.sname
AND i.id <> t2.id
AND status <> 'inactive'
当您只需要更新一个活动行时,这可以节省您更新1000行。
我自己的答案(尚未完成)。根据MSDN文档ExecuteNonQuery
当正在插入或更新的表上存在触发器时,返回值包括受插入或插入操作影响的行数更新操作和受触发器或影响的行数触发器。
这意味着我需要修改触发器本身以适应逻辑,或者甚至通过调用触发器时证明记录是成功的这一事实。这意味着如果我得到任何大于0的东西,那就应该被认为是成功的。虽然没有坚实的逻辑,但它会工作。SET COUNT ON必须加注释
也许我没有理解这个问题,但是如果您的目标是跟踪插入的行数,那么您应该维护一个调用存储过程的次数计数(当然,假设您的sproc每次插入一行)。
或者,如果您试图维护受影响的记录总数(由插入和更新),那么您可以将触发器中的逻辑合并到您的进程中。受插入语句(总是1)和更新语句(更新完成后@@rowcount)影响的行…然后可以将该值返回给调用者。
更新:当然,如果出现错误,则返回0。如果使用SQL2005(或更高版本),请使用TRY/CATCH机制。
添加一个存储过程不填充的额外列(left null)然后,当触发器运行时,只需将Null值更新为非空值,并使用update中的RowCount来确定更新了多少行。