如何处理SET ANSI_NULLS ON或OFF?

时间:2010-03-20 10:07:28

标签: sql sql-server database tsql

我想调用此过程发送一个可以为NULL或任何int值的值。

SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId

我只是想使用这个单一的查询而不是我现在在下面给出的代码中做的事情。

我搜索了这个怎么能这样做然后我得到this Link

根据这个,我必须设置ANSI_NULLS OFF

在执行我的sql查询之前,我无法在此过程中设置此项,然后在执行此操作后再次重置它。

ALTER PROCEDURE [Tags].[spOnlineTest_SubDomainSelect] 
    @SubDomainId INT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    IF @SubDomainId IS NULL
        SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId IS NULL 
    ELSE
        SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId
END

处理ANSI_NULLS或使用If If Else

的更好做法是什么

3 个答案:

答案 0 :(得分:8)

SET ANSI_NULLS在存储过程创建时定义,不能在运行时设置。

From CREATE PROC

  

使用SET选项

     

数据库引擎保存设置   SET QUOTED_IDENTIFIER和SET   存储Transact-SQL时的ANSI_NULLS   过程已创建或修改。   这些原始设置用于   执行存储过程。   因此,任何客户端会话设置   对于SET QUOTED_IDENTIFIER和SET   存储时忽略ANSI_NULLS   程序正在运行。其他SET   选项,例如SET ARITHABORT,SET   ANSI_WARNINGS或SET ANSI_PADDINGS   存储过程时不保存   已创建或修改。如果逻辑   存储过程取决于a   特殊设置,包括SET   声明开头的声明   保证适当的程序   设置。当SET语句是   从存储过程执行,   设置仅在有效期内保持有效   存储过程已完成   运行。然后恢复该设置   到存储过程的价值   什么时候叫它。这使得   个人客户设置选项   他们想要而不影响逻辑   存储过程。

同样适用于SET QUOTED_IDENTIFIER

在这种情况下,请使用IF ELSE,因为将来SET ANSI_NULLS ON

或Peter Lang的建议。

老实说,期待SubDomainId = @SubDomainId在@SubDomainId为NULL时工作并不正确使用NULL ...

答案 1 :(得分:2)

你不能使用单个查询吗?

SELECT DomainName, DomainCode
FROM Tags.tblDomain
WHERE ( @SubDomainId IS NULL AND SubDomainId IS NULL )
   OR ( SubDomainId = @SubDomainId )

答案 2 :(得分:0)

仅供参考,我很确定......

ANSI_NULLS OFF

在创建/编辑过程时适用于该过程,它类似于过程的设置。

因此,程序要么打开,要么关闭。你的例子是查询而不是程序,所以我有点困惑。

但是如果您有SQL 2005/2008,例如,如果您“编辑”过程,它会在新选项卡中打开您的过程,您会在顶部附近看到ANSI_NULLS OFF。

您可以在那里进行编辑并将其设置为ON或OFF并更新它以更改...