簡體   English   中英

如何處理SET ANSI_NULLS ON或OFF?

[英]How to Deal with SET ANSI_NULLS ON or OFF?

我想調用此過程發送一個可以為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更好的做法是什么

SET ANSI_NULLS在存儲過程創建時定義,不能在運行時設置。

來自CREATE PROC

使用SET選項

創建或修改Transact-SQL存儲過程時,數據庫引擎會保存SET QUOTED_IDENTIFIER和SET ANSI_NULLS的設置。 執行存儲過程時使用這些原始設置。 因此,存儲過程運行時,將忽略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將來會打開

或者Peter Lang的建議。

老實說,當@SubDomainId為NULL時,期望SubDomainId = @SubDomainId工作並不是真正正確使用NULL ...

你不能使用單個查詢嗎?

SELECT DomainName, DomainCode
FROM Tags.tblDomain
WHERE ( @SubDomainId IS NULL AND SubDomainId IS NULL )
   OR ( SubDomainId = @SubDomainId )

僅供參考,我很確定......

ANSI_NULLS OFF

在創建/編輯它時適用於該過程,它類似於過程的設置。

因此,程序要么打開,要么關閉。 你的例子是查詢而不是程序,所以我有點困惑。

但是,如果您有SQL 2005/2008,例如,如果您“編輯”過程,它會在新選項卡中打開您的過程,您將在頂部附近看到ANSI_NULLS OFF。

您可以在那里編輯並將其設置為ON或OFF並更新它以更改...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM