Как найти подпрограммы, созданные с помощью SET ANSI_NULLS OFF? - PullRequest
0 голосов
/ 27 мая 2019

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

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

2 голосов
/ 27 мая 2019

Вы можете просто установить 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)

1 голос
/ 27 мая 2019

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

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
...