2012-01-31 43 views
1

爲什麼我不能這樣做?爲什麼我不能在EXEC語句上使用NCHAR函數

EXEC mySproc NCHAR(0xA5) 

我得到

附近有語法錯誤的0xA5「。但

,我能做到這一點

DECLARE @foo NCHAR 
SET @foo = NCHAR(0xA5) 
EXEC mySproc @foo 

即使這樣

SELECT NCHAR(0xA5) 

有趣的是,SQL服務器如何選擇計算表達式。有什麼想法嗎?

+0

爲什麼-1?我希望知道爲什麼。 – 2012-01-31 16:06:47

+1

[請參閱此相關的連接項目請求](https://connect.microsoft。COM/SQLServer的/反饋/信息/ 352110/T-SQL使用標量函數-AS-存儲過程參數)。答案是「爲什麼?」似乎是他們只是沒有得到它。 – 2012-02-05 12:34:19

回答

5

,因爲它違反了T-SQL stored procedure call syntax其中指出:

Execute a stored procedure or function 
[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH RECOMPILE ] 
    } 
[;] 

其中

參數的值是否傳遞給模塊或傳遞 命令。如果未指定參數名稱,則必須按照模塊中定義的順序提供參數值 。

對鏈接服務器執行傳遞命令時,參數值的訂購號 取決於鏈接的 服務器的OLE DB提供程序。大多數OLE DB提供程序將值綁定到從左到右的參數 。

如果參數的值是由數據庫名稱或模式名稱限定的對象名稱,字符串或 ,則整個名稱必須使用單引號括起來的 。如果參數的值是關鍵字 ,則該關鍵字必須用雙引號括起來。

如果在模塊中定義了默認值,用戶可以在不指定參數的情況下執行模塊 。

默認值也可以是NULL。通常,模塊定義 指定如果參數值爲NULL,則應執行的操作。

從而

首先要進行所有的計算,將這些結果放入變量,然後傳遞變量到SP的呼叫

2

您不能將函數調用作爲參數傳遞給存儲過程。你必須首先評估他們(正如你在你的第二個例子一樣),然後把它們放入

你可以看到,這也將失敗。

exec myProc len('abc') 
+0

這是爲什麼?對我來說似乎很愚蠢。 – 2012-01-31 15:57:41

+0

它的EXECUTE行爲如何,'execute('select'+ NCHAR(0xA5))'也會失敗 – 2012-01-31 15:59:32

+0

對我來說這似乎也是不幸的。有很多次它會簡單得多,但事實就是這樣。奧列格對此有一個很好的答案。 – 2012-01-31 16:09:55

相關問題