2009-06-25 13 views
18

シナリオ: ストアドプロシージャにn個引数を渡す必要があります。引数の1つはタイプvarchar(x)です。そのvarchar引数は、他にもいくつかのvarchar変数から構成する必要があります。この問題はSQL Server 2005を使用しますが、この動作はSQL Serverのすべてのバージョンに適用されます。T-SQLストアドプロシージャに引数として連結した文字列を渡すことはできません

セットアップIncorrect syntax near '+'

DECLARE @MyString varchar(500), @MyBar varchar(10), @MyFoo varchar(10) 

SELECT @MyBar= 'baz ' 
SELECT @MyFoo= 'bat ' 

-- try calling this stored procedure! 
EXEC DoSomeWork @MsgID, 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".' 

これは、SQL Serverで例外を生成します。通常、データ型が間違っていると考えられます(つまり、変数の型は異なりますが、異なるエラーメッセージが生成されます)。は、T-SQLの引数としてvarchar型の連結を扱うことができないということですなぜ

SELECT @MyString= 'Hello ' + @MyBar + '" world! "' + @MyFoo + '".'; 

EXEC DoSomeWork @ID, @MyString 

質問:ここ

は、エラーなしでコンパイル正しい実装ですか? varcharとして適切に宣言されているので、型が分かっています。

あなたはあなたがあなたの一番下のクエリ でやっているように、それは、少なくとも機能のための非決定論的(であるので、それはあるかもしれないのparamにすべてのものを配置する必要があり、この

exec SomeProc getdate() 

いずれかのような何かを行うことはできません

答えて

19

EXECUTE文は、文法が異なるだけで、SELECTやSETなどの他の文もあります。たとえば、次の2ページの上部にある構文セクションを確認してください。

EXECUTE文:http://msdn.microsoft.com/en-us/library/ms188332.aspx

SET声明:http://msdn.microsoft.com/en-us/library/ms189484.aspx

だけEXECUTEの構文は、SETの構文のに対し

[[@parameter =] {value | @variable [OUTPUT] | [DEFAULT]]

を受け入れるには、表現を受け入れ

{@local_variable = expression}

値は基本的にハードコーディングされた定数ですが、式は評価されます。それはvarchar 'SELECT 1 + 1'のようなものです。今はちょうどvarchar値です。私が指摘していますすべてのEXECコマンドを使用すると、どうやらすでに判明定義によって表現することができないことであると仮定し

EXEC('SELECT 1 + 1') 

:ただし、このような文字列を評価することができます。私はT-SQLの開発者の意図がどこに来たのかは分かりません。ストアドプロシージャのパラメータリスト内でサブクエリ内にサブクエリを投げることが許可されている場合は、文法が不調に終わると思います。

T-SQL式:http://msdn.microsoft.com/en-us/library/ms190286.aspx

+2

このコメントに掲載されているウェブサイトはもう上がっていません。 – Buggieboy

+0

ありがとうございます。 MSDNを使用するためのリンクを更新しました。 – SurroundedByFish

関連する問題