我有很多程序set nocount on
.
是否有必要在存储过程结束时将其关闭?
例如:
create procedure DummyProc
as
begin
set nocount on
...
set nocount off
end
Run Code Online (Sandbox Code Playgroud) 我在Sql Server 2008数据库中创建存储过程.我想返回受影响的行数.哪个是更好的选择SET NOCOUNT OFF或RETURN @@ ROWCOUNT?
ALTER PROCEDURE [dbo].[MembersActivateAccount]
@MemberId uniqueidentifier
AS
BEGIN
-- Should I use this?
SET NOCOUNT OFF;
UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId;
--Or should I SET NOCOUNT ON and use the following line instead?
--return @@ROWCOUNT;
END
Run Code Online (Sandbox Code Playgroud)
我知道两者都有效,但这是一个更好的选择,为什么?
经过一番尝试后,我得出的结论是,在存储过程中,SET NOCOUNT默认为OFF.是否可以在我的数据库中更改此行为?
我认为我遇到的问题与kcrumley在问题" 通过经典ASP从另一个存储过程调用存储过程的问题"中描述的问题相同.然而,他的问题并没有真正包含一个解决方案,所以我会再给它一个镜头,添加我自己的观察结果:
我有两个存储过程:
CREATE PROCEDURE return_1 AS BEGIN
SET NOCOUNT ON;
SELECT 1
END
CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN
SET NOCOUNT ON;
EXEC return_1
SELECT 2
END
Run Code Online (Sandbox Code Playgroud)
请注意,这两个过程都包含"SET NOCOUNT ON".当我执行"call_return_1_and_return_2"时,我仍然可以获得两个记录集.首先是值1,然后是值2.
这会抛出ASP(经典的VBScript ASP).
关于如何抑制第一个结果集的任何提示?为什么即使有NOCOUNT呢?
跳过ASP中的第一个记录集不是一种选择.我需要一个"仅限数据库"的解决方案.
我们正在尝试将Microsoft Sync Framework实现到我们的应用程序中,该应用程序使用NHibernate持久化它的域.
我们遇到的一个问题是,在Sync Framework更改了您的初始数据库结构(添加影子表和触发器)之后,当您尝试将对象插入数据库时,NHibernate似乎会因为抛出toomanyrowsaffectedexception而感到不安.
我发现这篇文章的解决方案是在每个更新语句周围添加SET NOCOUNT ON和OFF,但由于表结构由nhibernate自动生成,同步触发器由Sync Framework自动生成,因此手动调整所有触发器实际上不是一个选项.
http://www.codewrecks.com/blog/index.php/2009/03/25/nhibernate-and-toomanyrowsaffectedexception/
我尝试按照此问题中的描述设置sql server 2008属性NOCOUNT:哪里是设置NOCOUNT的最佳位置? 但是这导致了StaleStateException(受影响的行数为-1,预期为1).
您是否知道是否有办法配置同步框架以在其触发器中自动设置这些NOCOUNT语句?或者有没有办法告诉NHibernate期望更多/更少的行被更改?或者也许你们中的任何人都有一个自动脚本来将这些NOCOUNT语句添加到同步框架的触发器中.
Thx提前!
我必须帮助将SQL Server 2008数据库迁移到PostgreSQL 9.4.10。原来querys有SET NOCOUNT ON
和SET NOCOUNT OFF
好几次,所以忽略了受影响的行数是不是一个解决方案我无法改变这个事实。这就是为什么我需要找到与此语句等效的原因,但是我所能找到的只是真正的旧帖子,他们说我应该忽略结果。有任何想法吗?谢谢。
编辑:这些SET NOCOUNT
都在这样的存储过程内:
CREATE PROCEDURE [procedureName]
Declares
--Variables
WITH ENCRYPTION
AS
SET NOCOUNT ON
--Procedure's code
SET NOCOUNT OFF
GO
Run Code Online (Sandbox Code Playgroud)
正如我所说的,这段代码不是我的,因此我发布的任何内容都不能超出我的怀疑范围。
我们引入了一个用于调用SQL存储过程的新数据访问框架.当调用返回记录集的存储过程时,我们遇到了存储过程也执行某种更新(插入/更新/删除)的问题:
无法更改具有Command对象作为其源的Recordset对象的ActiveConnection属性.
解决方法是在存储过程的顶部添加"SET NOCOUNT ON".这很好用,当然,它也有一个吹捧性能增强.
我们建议开发人员,当他们想编写代码来调用现有的存储过程时,他们还必须重构存储过程本身以包含SET NOCOUNT ON
.
但是,这让我想知道,对包括所有存储过程进行全面更新的潜在后果/风险是什么SET NOCOUNT ON
.在什么情况下会破坏SP的功能?(假设即使SET NOCOUNT为ON,@@ ROWCOUNT函数也会更新)
一如既往的帮助,非常感谢.
为了获得更好的性能,我们在 SP 内部使用Set NOCOUNT?
是否必须在 SP 末尾提及Set NOCOUNT off?
如果不是,它会伤害任何地方吗?
谢谢
sql-server sql-server-2005 nocount sql-server-2008 sql-server-2012
nocount ×8
sql-server ×6
sql ×4
t-sql ×3
.net ×1
c# ×1
nhibernate ×1
postgresql ×1
rowcount ×1