Как найти подпрограммы, созданные с помощью 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
Простой поиск может сделать это, например, это
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