2011-02-08 31 views
12

我試圖編寫一個存儲過程來協助開發我們的數據庫,但我在使用它時遇到了一些麻煩。例如:在存儲過程參數列表中使用表達式的結果(例如函數調用)?

DECLARE @pID int; 
SET @pID = 1; 
EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar); 

這會產生錯誤

消息102,級別15,狀態1(SQL Server 2005上),4號線 附近有語法錯誤 '+'。

有人可以向我解釋爲什麼我的語法不正確,並解決這個問題的正確方法?

回答

18

您需要使用中間變量。 SQL Server在參數列表中本身不支持這種操作,雖然它已經在TODO列表上好幾年了! (參見Connect Item: Use scalar functions as stored procedure parameters

grammar for EXEC

[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH <execute_option> [ ,...n ] ] 
    } 
[;] 

該文檔當前未對value可接受的格式,清楚,但它似乎是僅「簡單」表達式如文字值或@@前綴系統功能(如@@IDENTITY)。其他系統功能(例如SCOPE_IDENTITY())不允許(即使不要求括號如CURRENT_TIMESTAMP這些不允許)。

所以暫且你需要使用的語法如下面

DECLARE @pID INT; 

SET @pID = 1; 

/*If 2008+ for previous versions this needs to be two separate statements*/ 
DECLARE @string VARCHAR(50) = 'Could not find given id: ' + CAST(@pID AS VARCHAR(11)) 

EXEC WriteLog 
    'Component', 
    'Source', 
    @string 
+3

我希望避免中間變量。有沒有適當的方法來做到這一點,而不介紹它們? – WorkerThread

+0

啊,剛纔看到你的解釋。謝謝你澄清這一點。 – WorkerThread

+0

@工作者 - 這一切都有點煩人。 MS在此確認儘可能多https://connect.microsoft.com/SQLServer/feedback/details/352110/t-sql-use-scalar-functions-as-stored-procedure-parameters –

2
DECLARE @pID int; 
declare @IdAsString varchar(100) 

SET @pID = 1; 

Select @IdAsString ='Could not find given id: ' + Cast(@pId as varchar(10)) 

EXEC WriteLog 'Component', 'Source', @IdAsString 

正如馬丁指出,以下內容僅適用於列不變量。

請注意,我已經修改了你的施法至 varchar(10)這將允許超過1個位數大 整數。 varchar將只允許1個字符

+1

@Barry - 對於列來說是這樣的,但varchar變量的默認值是10.'select CAST('1234567890'as varchar)'。如果你打算允許否定的話,你需要'11'來滿足'int'的全部範圍。 –

+0

@馬丁 - 我不知道。感謝您指出。你知道爲什麼這種行爲有所不同嗎? – codingbadger

+0

@巴里 - 不 - 看起來相當令人困惑的不一致。我想這可能是一些歷史原因... –

1

您不能對存儲過程的參數進行操作。您應該將該值分配給另一個變量,然後將其傳遞給您的SP。

DECLARE @pID int, @nameId VARCHAR(100); 
SET @pID = 1; 
SET @nameId = 'Could not find given id: ' + CAST(@pID AS varchar); 

EXEC WriteLog 'Component', 'Source', @nameId 
0

也許是這樣的?

DECLARE @pID int; 
SET @pID = 1; 

DECLARE @Message NVARCHAR(50); 

SET @Message = 'Could not find given id: ' + CAST(@pID AS varchar) 
EXEC WriteLog 'Component', 'Source', @Message; 
0

試試這個...

DECLARE @pID int; 
SET @pID = 1; 

DECLARE @message varchar(255); 
SET @message = 'Could not find given id: ' + CAST(@pID AS varchar) 

EXEC WriteLog 'Component', 'Source', @message; 
0

DECLARE @Id詮釋

SET @id = 10

SELECT LTRIM(RTRIM(STR(@id)))AS stringValue

相關問題