2009-04-10 10 views
0

これはMS SQL 2005のためのものです:誰でも最初に成功した理由を知っていて、同じステートメントの2つを連続して作成できないのですか?すべてのステートメントはまったく同じです。二重引用符を二重引用符に変更することも同じ効果があります。sp_MSforeachdb MS SQLエラー

sp _ MSforeachdb @ command1 = 'if(left( "?"、2)= "p _")begin;印刷 "?";終わり;';

P _ NationalBrands __ P _アンダバー

しかし

_を開始することを
P _ NonBrand
P _データベース__を生成しますsp _ MSforeachdb @ command1 = 'if(left( "?"、2)= "p _")は開始します。印刷 "?";終わり;';
sp _ MSforeachdb @ command1 = 'if(left( "?"、2)= "p _")は開始します。印刷 "?";終わり;';

メッセージ102、レベル15、状態1、行2 付近に正しくない構文 'sp_MSforeachdb' を生成します。あなたはそのように複数のprocsを呼び出すときに明示的Execのを使用する必要が

答えて

1

それぞれがEXEC(UTE)を必要とする同じバッチ内の複数のストアドプロシージャ呼び出しを

EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 
EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 

私はいつもQUOTED_IDENTIFERS環境設定の問題を回避するために、2×単一引用符ではない二重引用符を使用すると思います。

+0

実際には、最初のコール以降のコールでのみexecが必要です。 (個人的に私は両方のスタイルの問題としてそれを置くが、それは必須ではない) – cmsjr

1

、ストアドプロシージャ

とEXECUTEを使用してExecute

のドキュメントから

sp_MSforeachdb @command1 = 'if (left("?", 2) = "p_") begin; print "?"; end;'; 
exec sp_MSforeachdb @command1 ='if(left("?", 2) = "p_") begin; print "?"; end;'; 

を試してみてください格納されたを実行するときにEXECUTE キーワードを指定する必要はありませんステートメントが の最初のバッチである場合は、プロシージャを実行します。