2017-10-10 56 views
1

執行我有一個select語句如下:獲得不同的結果,當代碼在存儲過程

SELECT TOP 1 TRY_CONVERT(UNIQUEIDENTIFIER,'6B75045F-22BF-4BD0-8170-32FA7DBF2A2xC') 
FROM [sch_ImmAnn].[viw_mdlImmAnnEle_Formulae] 

UID是故意不正確的,當我執行該語句,NULL值返回,如我所料。但是,如果我編碼存儲過程中這個語句,如下所示:

CREATE PROCEDURE [sch_Common].[usp_TestValid_UID] 
    @ExecUID UNIQUEIDENTIFIER 
AS 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    SELECT TOP 1 TRY_CONVERT(UNIQUEIDENTIFIER,@ExecUID) 
    FROM [sch_ImmAnn].[viw_mdlImmAnnEle_Formulae] 

END 

它,當我用相同的UID執行它返回一個錯誤穿過作爲參數:

誤差變換數據類型varchar到uniqueidentifier。

我該如何解決這個問題?爲什麼會發生?

+1

您將'@ ExecUID'聲明爲唯一標識符,然後嘗試將其轉換爲唯一標識符。我想你想聲明'@ ExecUID'作爲varchar? – waka

+0

'viw_mdlImmAnnEle_Formulae'是一種視圖,它本身會嘗試進行轉換嗎?你正在轉換一個參數(它已經是正確的類型),所以應該沒有任何影響(但是優化器可以自由地評估視圖中的行,或者不是,因爲它選擇了,所以傳遞一個文字不是和傳遞參數一樣)。 –

+0

waka,你是對的 - 這就是它不工作的原因。一旦我將@ExecUID更改爲varchar,就沒有問題。當你看到解決方案時總是如此明顯! Tks喬。 – mediaeval

回答

1

TOP沒有ORDER BY是不確定的;根據選擇的計劃,SQL Server可能會返回任意的行。添加ORDER BY以獲得一致的結果。

也就是說,由於2個查詢的SET選項不同,執行計劃可能會有所不同。請注意,ANSI_NULLSQUOTED_IDENTIFIER對於存儲過程是「粘滯」設置。 proc創建時有效的設置也會在執行時使用,而不是調用proc的會話設置。