【问题标题】:How to find routines that are created with SET ANSI_NULLS OFF?如何找到使用 SET ANSI_NULLS OFF 创建的例程?
【发布时间】:2019-05-27 13:21:10
【问题描述】:

我创建了一个过滤的非聚集索引以优化特定的查询集,但我开始从各种来源收到以下错误:

更新失败,因为以下 SET 选项不正确 设置:'ANSI_NULLS'。验证 SET 选项是否正确使用 在计算列上具有索引视图和/或索引和/或过滤 索引和/或查询通知和/或 XML 数据类型方法和/或 空间索引操作。

似乎有些遗留例程是使用SET ANSI_NULLS OFF 选项创建的,当引擎尝试从给定上下文更新目标表时,会引发错误。

我想知道有没有办法查看使用此选项创建的例程。例如,如果你编写这样的例程脚本,你会得到这样的结果:

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE ....

我通常使用如下脚本在对象定义中查找内容,但此设置不是其中的一部分:

DECLARE @SearchWord NVARCHAR(128) = 'SET ANSI_NULLS OFF' 
SELECT [ROUTINE_NAME] 
FROM [INFORMATION_SCHEMA].[ROUTINES]
WHERE [ROUTINE_DEFINITION] LIKE '%' + @SearchWord+'%' 
UNION
SELECT OBJECT_NAME([id]) 
FROM [SYSCOMMENTS]
WHERE [text] LIKE '%' + @SearchWord + '%' 
GROUP BY OBJECT_NAME([id])
UNION 
SELECT OBJECT_NAME(object_id)
FROM [sys].[sql_modules]
WHERE [definition] LIKE '%' + @SearchWord + '%' ;

【问题讨论】:

  • 我会使用 SSMS 编写整个数据库(所有对象,每个对象到单个文件中)的脚本,然后使用 grep 查找 SET ANSI_NULLS OFF
  • 我希望它存储在某个系统视图中:D,我将能够查询它:D
  • 它肯定存储在某个地方。我不知道在哪里,但 SSMS 确实知道。
  • sys.sql_modules 是你的朋友。

标签: sql-server tsql sql-server-2016 ansi-nulls


【解决方案1】:

一个简单的搜索就可以做到这一点,例如这样

SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc,
       m.*
FROM   sys.sql_modules m
  INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE  m.uses_ansi_nulls = 0

【讨论】:

    【解决方案2】:

    您可以只安装 Redgate 的 SQL Search 或其他供应商的类似产品。然后很容易搜索到这样的东西。

    一次性的,比如

    SELECT * FROM sys.sql_modules WHERE definition LIKE '% ansi %'
    

    应该这样做。或

    SELECT * FROM sys.sql_modules WHERE definition uses_ansi_nulls = 1
    

    sys.sql_modules (Transact-SQL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多