2011-02-08 3 views
12

データベースの開発を支援するためにストアドプロシージャを作成しようとしていますが、それを使用する際に問題があります。たとえば:ストアドプロシージャのパラメータリストで式の結果(関数呼び出しなど)を使用していますか?

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

これは、4行目 付近に正しくない構文 '+' を

メッセージ102、レベル15、状態1(SQL Server 2005の上の)エラーを生成します。

なぜ私の構文が正しくないのか、誰かがこの問題を解決する正しい方法を説明できますか?

答えて

18

中間変数を使用する必要があります。 SQL Serverは、パラメータリスト自体でこの種の操作をサポートしていませんが、それはTODOリストに数年間あります。

grammar for EXECは、ドキュメントは現在valueのための許容可能な形式上のものは明らかではないが、そのようなリテラル値または@@接頭辞のシステム機能としてのみ「単純な」表現であるように思わ

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

です(Connect Item: Use scalar functions as stored procedure parametersを参照してください) (例えば、@@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

@Worker - それはちょっと面倒です。 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 

としてはマーティンで指摘したような構文を使用する必要があることは、以下の列だけではない変数に適用されます。私はこれが1桁より大きく 整数が可能になります varchar(10)にあなたのキャストを改正している

注意。 varcharは1文字のみを許可します

+1

@Barry - それは列に当てはまりますが、 'varchar'変数のデフォルトは10です。' CAST( '1234567890' varchar) 'を選択します。あなたがネガを許そうとしているなら、 'int'の全範囲に対して' 11'が必要です。 –

+0

@マーティン - よくわからなかった。指摘してくれてありがとう。あなたはなぜ行動が違うのか知っていますか? – codingbadger

+0

@Barry - いいえ、それはかなり悩ましい不一致のようです。おそらくいくつかの歴史的な理由があると思います... –

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 = 10

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

SETをint型@Id代わりにこれを試してみてくださいstringValue

関連する問題