私はまだ SQL Server に比較的慣れていませんが、SQL Server について多くのことを気に入っています。物事を理解し始めてクルージングしているように感じたときに、さらに別の障害にぶつかります。私は動的 SQL パスをたどってきました (そして、有効期間が短い変数に関する制限を見つけました)、以前に受け取った提案 (変数を使用してスキーマを作成するスクリプト) に従って、代わりに sqlcmd スクリプトを記述しようとしています。
多くのスクリプトは、「そのまま」実行すると問題なく動作します。ただし、エラー処理を実装するためにそれらのいくつかを Try / Catch ブロックに入れるとすぐに、ばかげた制限に遭遇することがよくあります。バッチ。THAT を Try/Catch ブロック内のどこかに配置すると、構文エラーが発生することが保証されるため、このコンテキストでは Go は役に立ちません。
明らかに、私はこれについて Web を精査しました (そして、この投稿の編集中に表示された「同様の質問」のいくつかを見てきました) が、上記の意味で「裸」であるか、Try/Catch である例を引き続き考え出しますこれらの制限がないコードの例。
スキーマを作成する場合は、動的 SQL について提案された方法を使用しました。sp_executesql で実行しました。これは基本的に 1 行のコードであるため、問題ではありません。問題は、テーブルにトリガーを作成しようとしたときにもう一度ヒットすることです (他のいくつかの Create コマンドを使用すると推測しています)。
CREATE TRIGGER MySchema.NoDelete
ON MySchema.MyTable
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
RAISERROR ('Deletions are not allowed on this table', 16,1)
END
これを単独で実行すると問題ありません。Begin Try をその前に置き、End Try と Catch ブロックをその後に置くと、次のようになります。
メッセージ 156、レベル 15、状態 1、行 3 キーワード「TRIGGER」付近の構文が正しくありません。
BEGIN に赤い波線があり、偽のツール ヒント「Begin 付近の構文が正しくありません。External が必要です」。
これで sp_executesql パスをもう一度試しましたが、
まず、偽の「$ 付近の構文エラー」エラーも生成されました。これは、ここと惑星 Zargthorp の間のどこかに構文エラーがあることを伝えるのと同じくらい役に立ちますが、さらに重要なことは次のとおりです。
第二に、このような比較的些細なトリガーで機能するようになったとしても、複雑な複数行のトリガーをそのような方法でパッケージ化することを想像しようとして悪夢を見ていますが、それを乗り越えたとしても。
第 3 に、コードがより不明瞭になり、そもそもスクリプトを使用する目的の 1 つである自己文書化が無効になります。
したがって、私の質問は次のとおりです。
Try/Catch は、MS 設計者に最もよく知られている理由により、Create Trigger のような孤立した威厳の中に存在する必要があるコマンド (および、sp_executesql にきちんとパッケージ化できる Create Schema のようなワンライナーではない) に対して効果的に役に立たないか? また
比較的初心者の私は、Create Trigger で叩きつけられた種類の制限を回避する他の方法を見逃していませんか?
ご回答ありがとうございます。