如何处理SET ANSI_NULLS ON或OFF?

Sha*_*pta 7 sql t-sql database sql-server

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

SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId
Run Code Online (Sandbox Code Playgroud)

我只是想使用这个单一的查询,而不是现在我正在做的下面给出的代码.

我搜索了这个怎么能这样做然后我得到了这个链接.

根据这个,我必须设置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
Run Code Online (Sandbox Code Playgroud)

处理ANSI_NULLS或使用If Else更好的做法是什么

gbn*_*gbn 8

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

来自CREATE PROC

使用SET选项

创建或修改Transact-SQL存储过程时,数据库引擎会保存SET QUOTED_IDENTIFIER和SET ANSI_NULLS的设置.执行存储过程时使用这些原始设置.因此,存储过程运行时,将忽略SET QUOTED_IDENTIFIER和SET ANSI_NULLS的任何客户端会话设置.创建或修改存储过程时,不会保存其他SET选项,例如SET ARITHABORT,SET ANSI_WARNINGS或SET ANSI_PADDINGS.如果存储过程的逻辑取决于特定设置,请在过程开始时包含SET语句以保证适当的设置.从存储过程执行SET语句时,该设置仅在存储过程完成运行之前保持有效.然后,该设置将恢复为存储过程在调用时所具有的值.这使各个客户端可以设置所需的选项,而不会影响存储过程的逻辑.

这同样适用于 SET QUOTED_IDENTIFIER

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

或者Peter Lang的建议.

说实话,期望SubDomainId = @SubDomainId在@SubDomainId为NULL时工作并不是真正正确使用NULL ...