Как иметь дело с SET ANSI_NULLS НА или ПРОЧЬ?

Я хочу назвать эту процедуру, которая отправляет одно значение, которое может быть НУЛЕВЫМ или любое международное значение.

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

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

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

Согласно этому я должен выделить ANSI_NULLS

Я не могу установить эту внутреннюю часть эта процедура прежде, чем выполнить мой запрос 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 или Используя Если

7
задан Shantanu Gupta 20 March 2010 в 10:07
поделиться

3 ответа

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

Из CREATE PROC

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

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

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

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

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

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

8
ответ дан 7 December 2019 в 01:19
поделиться

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

ANSI_NULLS OFF

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

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

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

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

0
ответ дан 7 December 2019 в 01:19
поделиться

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

SELECT DomainName, DomainCode
FROM Tags.tblDomain
WHERE ( @SubDomainId IS NULL AND SubDomainId IS NULL )
   OR ( SubDomainId = @SubDomainId )
2
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: