適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric SQL Database
データベース コードを分析することで、設計と名前付けの潜在的な問題を排除し、パフォーマンスの落とし穴を回避できます。 概念は、マネージド コードの欠陥を検出して修正するためにスタティック分析を実行するのとよく似ています。 データベース コードに適用する分析ルールを構成し、コードを分析してから、特定した問題を修正または無視します。 データベース コードを分析する前に、まずデータベース スキーマをデータベース プロジェクトにインポートする必要があります。 詳細については、「既存のデータベースから開始する」を参照してください。
提供ルール を使用してスタティック分析を実行することで、次のカテゴリに分類される問題を特定できます:
T-SQL の設計の問題 設計の問題には、想定どおりに動作しない可能性があるコード、非推奨の構文、およびデータベースの設計が変更されたときに問題が発生する可能性がある問題が含まれます。
T-SQL の名前付けの問題 名前付けの問題は、データベース オブジェクトの名前が予期しない問題を引き起こしたり、一般的に受け入れられる規約に違反したりする可能性がある場合に発生します。
T-SQL のパフォーマンスの問題 パフォーマンスの問題には、データベース操作が完了する速度が著しく低下する可能性があるコードが含まれます。 これらの問題の多くは、コードの実行時にテーブル スキャンを発生させるコードを識別します。
コード分析ルールは拡張可能です。 独自のルールを作成して、独自のコーディング標準を適用できます。 詳細については、「コード分析ルールの拡張情報の概要」を参照してください。
SQL プロジェクト ファイルのサンプルと構文
SQL プロジェクト ファイルには、RunSqlCodeAnalysis
と SqlCodeAnalysisRules
の 2 つのプロパティを含めることができます。 RunSqlCodeAnalysis
要素は、プロジェクトのビルド時にコード分析を実行するかどうかを指定します。 既定では、含まれるすべてのルールが実行され、ルール パターン検出の結果がビルド警告になります。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
<Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
<PropertyGroup>
<Name>AdventureWorks</Name>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
<ModelCollation>1033, CI</ModelCollation>
<RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
</PropertyGroup>
...
SqlCodeAnalysisRules
要素は、ルールとそのエラー/警告動作を指定します。 次の例では、ルール Microsoft.Rules.Data.SR0006 と Microsoft.Rules.Data.SR0007 が無効になっており、ルール Microsoft.Rules.Data.SR0008 の検出によってビルド エラーが発生します。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build">
<Sdk Name="Microsoft.Build.Sql" Version="1.0.0" />
<PropertyGroup>
<Name>AdventureWorks</Name>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql160DatabaseSchemaProvider</DSP>
<ModelCollation>1033, CI</ModelCollation>
<RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
<SqlCodeAnalysisRules>-Microsoft.Rules.Data.SR0006;-Microsoft.Rules.Data.SR0007;+!Microsoft.Rules.Data.SR0008</SqlCodeAnalysisRules>
</PropertyGroup>
...
ファイル StaticCodeAnalysis.SuppressMessages.xml
をプロジェクトに追加して、特定のコード分析結果を抑制できます。 次の例では、ファイル SR0001
のストアド プロシージャの警告 StoredProcedures/uspGetEmployeeManagers.sql
を抑制します。
<?xml version="1.0" encoding="utf-8" ?>
<StaticCodeAnalysis version="2" xmlns="urn:Microsoft.Data.Tools.Schema.StaticCodeAnalysis">
<SuppressedFile FilePath="StoredProcedures/uspGetEmployeeManagers.sql">
<SuppressedRule Category="Microsoft.Rules.Data" RuleId="SR0001" />
</SuppressedFile>
</StaticCodeAnalysis>
指定されたルール
T-SQL の設計に関する問題
データベース プロジェクトで T-SQL コードを分析すると、1 つまたは複数の警告が設計上の問題として分類される場合があります。 次の状況を回避するには、設計上の問題に対処する必要があります:
- データベースに対する後続の変更により、データベースに依存するアプリケーションが中断される可能性があります。
- そのコードは期待した結果をもたらさない可能性があります。
- SQL Server の今後のリリースでコードを実行すると、そのコードが中断する可能性があります。
一般に、現在も将来も、アプリケーションが中断する可能性があるからといって、設計上の問題を抑制してはいけません。
指定されたルールは、次の設計上の問題を特定します:
- SR0001: ストアド プロシージャ、ビュー、およびテーブル値関数では SELECT * を使用しないようにする
- SR0008: @@IDENTITY の代わりに SCOPE_IDENTITY を使用することを検討する
- SR0009: サイズ 1 または 2 の可変長の型を使用しないようにする
- SR0010: テーブルまたはビューを結合するときに非推奨の構文を使用しないようにする
- SR0013: 出力パラメーター (パラメーター) がすべてのコード パスに設定されていない
- SR0014: {Type1} から {Type2} へのキャスト時にデータ損失が発生する可能性があります
T-SQL の名前付けの問題
データベース プロジェクトで T-SQL コードを分析すると、1 つまたは複数の警告が名前付けの問題として分類される場合があります。 次の状況を回避するには、名前付けの問題に対処する必要があります:
- オブジェクトに指定した名前は、システム オブジェクトの名前と競合する可能性があります。
- 指定した名前は、常にエスケープ文字で囲む必要があります (SQL Server では '[' および ']')。
- 指定した名前は、コードの読み取りと理解を試みる他のユーザーを混乱させる可能性があります。
- SQL Server の今後のリリースでコードを実行すると、そのコードが中断する可能性があります。
通常、変更できない他のアプリケーションが現在の名前に依存する場合は、名前付けの問題を抑制できます。
指定されたルールは、次の設計上の問題を特定します:
- SR0011: オブジェクト名に特殊文字を使用しないようにする
- SR0012: 型名に予約語を使用しないようにする
- SR0016: ストアド プロシージャの名前の先頭に sp_ を使用しないようにする
T-SQL のパフォーマンスの問題
データベース プロジェクトで T-SQL コードを分析すると、1 つまたは複数の警告がパフォーマンスの問題として分類される可能性があります。 次の状況を回避するには、パフォーマンスの問題に対処する必要があります:
- テーブル スキャンは、コードの実行時に実行されます。
一般に、スキャンしてもパフォーマンスが大幅に低下しない程度にテーブルのデータ量が少ない場合は、パフォーマンスの問題を抑制することができます。
指定されたルールは、次の設計上の問題を特定します:
- SR0004: IN 述語のテスト式としてインデックスがない列を使用しないようにする
- SR0005: LIKE 述語において "%" で始まるパターンを使用しないようにする
- SR0006: 列参照を比較演算子の一方の側に移動して、列インデックスを使用する
- SR0007: 式の Null 許容列に ISNULL(column, default_value) を使用する
- SR0015: WHERE 述語から決定論的関数呼び出しを抽出する
コード分析を有効/無効にする
Visual Studio で SQL コード分析を有効または無効にするには、ソリューション エクスプローラー でプロジェクトを右クリックし、[プロパティ] を選択します。 プロパティ ウィンドウの [コード分析] タブで、目的のコード分析設定を選択します。
特定のルールを無効または有効にするには、テーブルからルールを選択します。 ルールの重大度を変更するには、一覧からそのルールの [警告をエラーとして扱う] ボックスを選択します。
SDK スタイルの SQL プロジェクト (プレビュー) で SQL Code Analysis を有効または無効にするには、.sqlproj
ファイルを直接編集します。 プロジェクトをダブルクリックして、.sqlproj
ビューから ファイルを開きます。
テキスト エディターから、最初の <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
ブロックに要素 <PropertyGroup>
を追加して、コード分析を有効にします。 コード分析を無効にするには、RunSqlCodeAnalysis
要素の値を True
または False
に変更するか、要素全体を削除します。
SQL データベース プロジェクトの拡張機能で SQL コード分析を有効または無効にするには、.sqlproj
ファイルを直接編集します。 .sqlproj
ビューから ファイルを開くか、[データベース プロジェクト] ビューでプロジェクトを右クリックし、[.sqlproj ファイルを編集する] を選択します。
テキスト エディターから、最初の <RunSqlCodeAnalysis>True</RunSqlCodeAnalysis>
ブロックに要素 <PropertyGroup>
を追加して、コード分析を有効にします。 コード分析を無効にするには、RunSqlCodeAnalysis
要素の値を True
または False
に変更するか、要素全体を削除します。
プロジェクト ファイルのコード分析設定をオーバーライドするには、/p:RunSqlCodeAnalysis
コマンドを使用して /p:SqlCodeAnalysisRules
プロパティと dotnet build
プロパティを使用できます。 たとえば、コード分析を無効にしてビルドするには、次のようにします:
dotnet build /p:RunSqlCodeAnalysis=False
特定の SQL コード分析ルールの設定を使用してビルドするには:
dotnet build /p:RunSqlCodeAnalysis=True /p:SqlCodeAnalysisRules="+!Microsoft.Rules.Data.SR0001;+!Microsoft.Rules.Data.SR0008"