今日、追跡が非常に困難なバグが私たちのプロジェクトに現れました。
データが挿入または更新されたときに、いくつかのストアド プロシージャを呼び出すなど、特定のアクションを実行するトリガーがあり、プログラムは正しく動作しているように見えました。そうでない場合を除いて。
何時間もの苦労の末、ようやく原因を突き止めました。EXEC ステートメントのパラメータ名の前に「@」がありません。次の最小限の例は、問題を示しています。
CREATE PROCEDURE EchoString @TheString nvarchar(30)
AS
SELECT @TheString
GO
declare @MyString char(10) = 'FooBar!'
exec EchoString @MyString
exec EchoString MyString -- Why does this work?
さて、これは疑問に思いました: これを許可する目的は何ですか? 下位互換性のためだけですか、それとも正当な使用例はありますか? それはどこかに文書化されていますか(私の弱いグーグル検索は空白になりましたが、「@」はグーグル対応ではありません。)