Как найти подпрограммы, созданные с помощью SET ANSI_NULLS OFF?

Я создал отфильтрованный некластеризованный индекс для оптимизации определенного набора запросов, но я начал получать следующие ошибки из различных источников:

ОБНОВЛЕНИЕ не удалось, потому что следующие параметры 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 + '%' ;

2 ответа

Решение

Вы можете просто установить SQL Search от Redgate или аналогичные продукты других производителей. Тогда легко искать такие вещи.

Для разового, что-то вроде

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)

Простой поиск может сделать это, например, это

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
Другие вопросы по тегам