2010-03-20 46 views
6

我想調用此過程發送一個值可以是NULL或任何int值。如何處理SET ANSI_NULLS ON或OFF?

SELECT DomainName, DomainCode FROM Tags.tblDomain WHERE SubDomainId [email protected] 

我只是想使用這個單一的查詢,而不是我現在正在做的下面給出的代碼。

我搜索了這一點,我怎麼能做到這一點的話,我得到了this Link

根據這一點,我必須設置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 [email protected] 
END 

什麼將是更好的做法是做處理ANSI_NULLS或使用的if else

回答

8

SET ANSI_NULLS是在ONY PROC存儲創建時間定義,不能在運行時進行設置。

From CREATE PROC

使用SET選項

數據庫引擎保存設置兩個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在未來

或Peter Lang的建議。

說實話,期待SubDomainId = @SubDomainId上班的時候@SubDomainId爲NULL不爲NULL的真正正確使用...

+0

@gbn thx提供了很好的解釋。 – 2010-03-20 13:51:31

2

你不能用一個單一的查詢?

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

@Peter郎鹹平:爲解決THX,目前我將UR解決方案的鍛鍊。但問題仍然對ANSI_NULLS開放。 – 2010-03-20 10:47:06

0

僅供參考,我敢肯定...

ANSI_NULLS OFF 

在創建/編輯它適用的程序,它就像程序的設置。

因此,無論過程有其開啓或關閉。你的例子是一個查詢不是一個過程,所以我有點困惑。

但是如果你,如果你的「編輯」的過程在一個新標籤中打開你的程序有例如SQL 2005/2008,你會看到關在靠近頂端處ANSI_NULLS。

你可以對它進行編輯,並將其設置爲ON或OFF,並更新其改變......

+0

請注意,您也可以在查詢中使用該設置...我只是說它如何與程序一起使用。 – 2010-03-20 10:20:53

+0

我想用查詢來使用它。我正在爲程序正常工作,即如果我在程序上關閉它。但是我只想將其設置爲僅針對查詢。任何建議? – 2010-03-20 10:45:30