Как справиться с SET ANSI_NULLS ON или OFF? - PullRequest
7 голосов
/ 20 марта 2010

Я хочу вызвать эту процедуру, которая отправляет одно значение, которое может быть NULL или любое значение типа int.

SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId =@SubDomainId

Я просто хочу использовать этот единственный запрос, а не то, что я делаю сейчас в приведенном ниже коде.

Я искал это, как я мог это сделать, тогда я получил эту ссылку .

В соответствии с этим я должен установить 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 или использованием If Else

Ответы [ 3 ]

8 голосов
/ 20 марта 2010

SET ANSI_NULLS определяется только во время создания сохраненного процесса и не может быть установлен во время выполнения.

Из CREATE PROC

Использование параметров SET

Database Engine сохраняет настройки как SET QUOTED_IDENTIFIER, так и SET ANSI_NULLS при сохранении Transact-SQL процедура создана или изменена. Эти оригинальные настройки используются, когда хранимая процедура выполнена. Поэтому любые настройки сеанса клиента для SET QUOTED_IDENTIFIER и SET ANSI_NULLS игнорируются при сохранении процедура запущена. Другой набор такие параметры, как SET ARITHABORT, SET ANSI_WARNINGS или SET ANSI_PADDINGS не сохраняются при сохранении процедуры создан или изменен. Если логика хранимой процедуры зависит от конкретные настройки, включают в себя набор заявление в начале Процедура, чтобы гарантировать соответствующее установка. Когда оператор SET выполняется из хранимой процедуры, настройка действует только до хранимая процедура завершена Бег. Затем настройка восстанавливается к значению хранимой процедуры когда это называлось. Это позволяет отдельные клиенты, чтобы установить параметры они хотят, не влияя на логику хранимой процедуры.

То же самое относится к SET QUOTED_IDENTIFIER

В этом случае используйте IF ELSE, поскольку SET ANSI_NULLS будет ON в будущем.

Или предложение Питера Ланга.

Если честно, ожидать, что SubDomainId = @SubDomainId будет работать, когда @SubDomainId равен NULL, не совсем корректно использование NULL ...

2 голосов
/ 20 марта 2010

Не можете ли вы использовать один запрос?

SELECT DomainName, DomainCode
FROM Tags.tblDomain
WHERE ( @SubDomainId IS NULL AND SubDomainId IS NULL )
   OR ( SubDomainId = @SubDomainId )
0 голосов
/ 20 марта 2010

К вашему сведению, я почти уверен ...

ANSI_NULLS OFF

Применяется к процедуре при ее создании / редактировании, это похоже на настройку процедуры.

Таким образом, либо процедура включена, либо выключена. Ваш пример был запросом, а не процедурой, поэтому я немного запутался.

Но если у вас есть SQL 2005/2008, например, если вы «редактируете» процедуру, она открывает вашу процедуру в новой вкладке, вы увидите ANSI_NULLS OFF в верхней части.

Вы можете отредактировать его там и включить или выключить, а затем обновить, чтобы изменить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...