【问题标题】:How to Deal with SET ANSI_NULLS ON or OFF?如何处理 SET ANSI_NULLS ON 或 OFF?
【发布时间】:2010-03-20 10:07:28
【问题描述】:

我想调用这个过程,它发送一个可以是 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 或 Using If Else 的更好做法是什么

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

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

    From CREATE PROC

    使用 SET 选项

    数据库引擎保存设置 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 存储 Transact-SQL 时 创建或修改程序。 这些原始设置用于 存储过程被执行。 因此,任何客户端会话设置 对于 SET QUOTED_IDENTIFIER 和 SET 存储时忽略 ANSI_NULLS 程序正在运行。其他套装 选项,例如 SET ARITHABORT、SET ANSI_WARNINGS,或设置 ANSI_PADDINGS 存储过程时不保存 被创建或修改。如果逻辑 的存储过程取决于 特定设置,包括一个 SET 开头的声明 确保适当的程序 环境。当一个 SET 语句是 从存储过程执行, 设置保持有效,直到 存储过程已完成 跑步。然后恢复设置 存储过程的值 当它被调用时。这使 个人客户设置选项 他们想要在不影响逻辑的情况下 存储过程。

    同样适用于SET QUOTED_IDENTIFIER

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

    或者 Peter Lang 的建议。

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

    【讨论】:

      【解决方案2】:

      您不能使用单个查询吗?

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

      【讨论】:

      • @Peter Lang:感谢您的解决方案,目前我将从您的解决方案中锻炼。但问题仍然对 ANSI_NULLS 开放。
      【解决方案3】:

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

      ANSI_NULLS OFF
      

      在创建/编辑过程时应用于过程,就像过程的设置一样。

      所以程序要么打开要么关闭。您的示例是查询而不是过程,所以我有点困惑。

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

      您可以在此处对其进行编辑并将其设置为 ON 或 OFF,然后对其进行更新以更改...

      【讨论】:

      • 注意,您也可以在查询中使用该设置...我只是说它如何与过程一起使用。
      • 我正在尝试将它与查询一起使用。我在程序上工作得很好,即如果我在程序上关闭。但我只想为查询关闭它。有什么建议吗?
      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2015-12-19
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多