同様の質問に次の回答を投稿しました: Advantage of SQL SERVER CLR。ただし、C# / VB.net / etc が T-SQL よりも使いやすい言語であることは、T-SQL よりもSQLCLR を使用する理由にはならないことをここに追加します。T-SQL で何かを達成する方法がわからない場合は、まず T-SQL ソリューションを見つけるための支援を求めてください。存在しない場合は、CLR ルートに進みます。
SQL Server 内での SQLCLR / CLR 統合は、特定の問題 (すべてではない) の解決に役立つツールの 1 つです。純粋な T-SQL で実行できることよりも優れていることがいくつかあり、SQLCLR を介してのみ実行できることがいくつかあります。SQL Server Central の記事、SQLCLR レベル 1 への階段: SQLCLR とは何ですか? を書きました。(そこで記事を読むには無料の登録が必要です)、それはこの質問に対処します. 基本は次のとおりです (詳細については、リンクされた記事を参照してください)。
- ストリーミング テーブル値関数 (sTVF)
- 動的 SQL (関数内)
- 外部リソースへのアクセスの改善 / xp_cmdshell の置き換え
- データの受け渡しがより簡単に
- 結果セットの複数の列を取得する方が簡単です
- 外部依存関係なし (例: 7zip.exe)
- なりすましによるセキュリティの向上
- マルチスレッド機能
- エラー処理 (関数内)
- カスタム集計
- カスタム タイプ
- 状態の変更 (関数内で
OPENQUERY
/なしOPENROWSET
)
- ストアド プロシージャの実行 (読み取り専用。関数内で
OPENQUERY
/なしOPENROWSET
)
- パフォーマンス (注:これはすべての場合を意味するわけではありませんが、操作の種類と複雑さによっては、場合によっては確実に意味があります)
- 出力 (つまり、SSMS の [メッセージ] タブに送信されるもの) をキャプチャできます (たとえば
PRINT
、重大度= 0 ~ 10) -- 記事でこれについて言及するのを忘れていました ;-)。RAISERROR
考慮すべきもう 1 つの点は、アプリケーション コードにアクセスするためだけに内部専用のカスタム画面を作成しなくても、DB が特定のビジネス ロジックを把握できるように、アプリケーションと DB の間でコードを共有できると有益な場合があることです。たとえば、顧客からデータ ファイルをインポートし、ほとんどのフィールドのカスタム ハッシュを使用して、その値を DB の行に保存するシステムに取り組んできました。これにより、アプリが入力ファイルから値をハッシュし、行に格納されているハッシュ値と比較するため、データを再度インポートするときに行を簡単にスキップできました。それらが同じである場合、どのフィールドも変更されていないことがすぐにわかったので、次の行に進みました。これは単純な INT 比較でした。しかし、ハッシュを行うためのアルゴリズムはアプリのコードにしか含まれていなかったため、顧客のケースをデバッグするため、または少なくとも 1 つのフィールドに変更 (アプリからの変更) がある行にフラグを付けてバックエンド サービスに一部の処理をオフロードする方法を探すためかどうかに関係なく、新しいインポート ファイル内の変更を探すのではなく)、私にできることは何もありませんでした。これは、通常の処理ではなくても、DB にかなり単純なビジネス ロジックを含める絶好の機会でした。DB にエンコードされた値があり、その意味を理解することができないと、問題の解決が非常に難しくなります。これは、通常の処理ではなくても、DB にかなり単純なビジネス ロジックを含める絶好の機会でした。DB にエンコードされた値があり、その意味を理解することができないと、問題の解決が非常に難しくなります。これは、通常の処理ではなくても、DB にかなり単純なビジネス ロジックを含める絶好の機会でした。DB にエンコードされた値があり、その意味を理解することができないと、問題の解決が非常に難しくなります。
コードを記述せずにこれらの機能の一部を実際に見てみたい場合は、SQL#の無料バージョン(私が作成者です) には、正規表現関数、カスタム集計 (UDA)、カスタム タイプ (UDT) などがあります。