データベース参照の概要

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

SQL プロジェクトのデータベース参照を使用すると、別のプロジェクト、.dacpac ファイル、発行済みの NuGet パッケージにリンクすることにより、プロジェクトに含まれていないオブジェクトを組み込むことができます。 プロジェクトに追加するデータベース オブジェクトは、同じデータベース、同じサーバー上の別のデータベース、または別のサーバー上の別のデータベースの一部にすることができます。 SQL Server開発では、データベース参照を使用して、3 部構成の名前付けに同じサーバー上の別のデータベースにリンクするか、データベース間クエリ用に別のサーバー上の別のデータベースにリンクします。 個別のグループに多数のオブジェクトがあるデータベースの場合は、データベース参照を使用して、データベースをより小さく、より管理しやすいプロジェクトに分割します。 プロジェクト サイズを小さくすると、パフォーマンスを向上させ、反復的なローカル開発中にプロジェクトをビルドするために必要な時間を短縮できます。

dacpac、nuget パッケージ、データベース参照用のプロジェクトを参照する SQL プロジェクトの例のスクリーンショット。

Note

新しい開発でデータベース参照にプロジェクト参照と NuGet パッケージ参照を使用します。 元の SQL プロジェクトでは、NuGet パッケージの参照はサポートされていません。

SQL プロジェクト ファイルのサンプルと構文

C# プロジェクトと同様に、 .sqlproj ファイル内のエントリを介してプロジェクトにデータベース参照を含めます。 SQLCMD 構文を使用して、SQL プロジェクト オブジェクトのデータベース名を参照します。 データベース参照が同じサーバー上の別のデータベースを指している場合は、プロジェクト参照に <DatabaseSqlCmdVariable> 要素を含めます。 データベース参照が別のサーバー上の別のデータベースを指している場合は、プロジェクト参照に <ServerSqlCmdVariable> 要素も含めます。 同じデータベースへのデータベース参照には、<ServerSqlCmdVariable> または <DatabaseSqlCmdVariable> 要素は含まれません。

SQL スクリプトにデータベース参照への特定の参照を含めるには、プロジェクト ファイルに名前付けされた SQLCMD 変数を使用して、データベース名を指定します。 たとえば、次の SQL スクリプトは Warehouse データベース内のテーブルを参照します。

SELECT ProductId,
       StorageLocation,
       BinNumber
FROM [$(Warehouse)].[Production].[ProductInventory];

プロジェクト ファイルには、 $(Warehouse) SQLCMD 変数に対応するデータベース参照が含まれており、 <DatabaseSqlCmdVariable>Warehouse</DatabaseSqlCmdVariable>が含まれています。

同じデータベースの 3 部構成の名前付け

SQL プロジェクト内のオブジェクトが同じデータベース内の別のオブジェクトを参照する場合、データベース参照を介してオブジェクトが含まれている場合でも、3 部構成の名前付けは必要ありません。 ただし、SQL プロジェクトにはデータベース名の自動 SQLCMD 変数が組み込まれています。この変数を SQL スクリプトで使用すると、名前をハードコーディングせずにプロジェクトのデータベースを参照できます。 3 部構成の名前付けが必要な場合は、SQL スクリプトで $(DatabaseName) を使用してデータベースを参照します。 たとえば、次の SQL スクリプトは、プロジェクトのデータベース内のテーブルを参照します。

UPDATE [$(DatabaseName)].[SalesLT].[Customer]
SET [SalesPerson] = 'John Doe',
    [ModifiedDate] = GETDATE()
WHERE [CustomerId] = @CustomerId;

データベースのリテラル値

場合によっては、SQL オブジェクト内のデータベース参照のデータベース名にリテラル (非変数) 値を使用することが必要になる場合があります。 SQLCMD 変数を使用する代わりに、データベース名のリテラル値を指定するように .sqlproj ファイルを構成できます。 リテラル値を指定するために使用される要素は <DatabaseLiteralValue>。 この要素を使用する場合は、 <DatabaseSqlCmdVariable> 要素を使用しないでください。 <DatabaseLiteralValue>要素内で、データベース名のリテラル値を指定します。 たとえば、 <DatabaseVariableLiteralValue>WarehouseDB</DatabaseVariableLiteralValue> を含むデータベース参照は、次のように SQL スクリプトで使用されます。

SELECT ProductId,
       StorageLocation,
       BinNumber
FROM [WarehouseDB].[Production].[ProductInventory];

プロジェクト参照

この例では、同じデータベースの一部である AdventureWorksSalesLT.sqlproj という名前の SQL プロジェクトにプロジェクト参照を追加します。

  <ItemGroup>
    <ProjectReference Include="..\AdventureWorks\AdventureWorksSalesLT.sqlproj">
      <Name>AdventureWorksSalesLT</Name>
      <Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
      <Private>True</Private>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
    </ProjectReference>
  </ItemGroup>

Dacpac パッケージ参照

SQL プロジェクトのパッケージ参照の詳細については、「 SQL プロジェクトのパッケージ参照」を参照してください

次の例は、SQL Server 2022 の システム データベースへのmasterを示しています。

  <ItemGroup>
    <PackageReference Include="Microsoft.SqlServer.Dacpacs.Master" Version="160.2.1" />
  </ItemGroup>

Dacpac アーティファクト参照

SDK スタイルのプロジェクトでの新しい開発には、 .dacpac 成果物ファイルへの直接参照を使用しないでください。 代わりに、NuGet パッケージ参照を使用します。

元の SQL プロジェクトでは、.sqlproj ファイルで <ArtifactReference> 項目を使用して .dacpac ファイル参照を指定します。 次の例では、同じサーバーにある別のプロジェクト内の.dacpac ファイルへの .dacpac アーティファクト参照が示されています。

  <ItemGroup>
    <ArtifactReference Include="..\AdventureWorks\Warehouse\bin\Release\Warehouse.dacpac">
      <HintPath>..\AdventureWorks\Warehouse\bin\Release\Warehouse.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseSqlCmdVariable>Warehouse</DatabaseSqlCmdVariable>
    </ArtifactReference>
  </ItemGroup>

プロジェクト参照の追加と使用

プロジェクト参照を追加する

Visual Studio で SQL プロジェクトにプロジェクト参照を追加するには、ソリューション エクスプローラーのプロジェクトの下にある [参照] ノードを右クリックし、[データベース参照の追加] を選択します。

データベース参照の Visual Studio ダイアログのスクリーンショット。

データベース参照の追加 ダイアログには、次のものに参照を追加するためのオプションが表示されます。

  • 同じソリューションの SQL プロジェクト
  • システム データベース (Visual Studio に自動的に含まれる .dacpac ファイルから)
  • ローカル ファイル システム上の任意のデータ層アプリケーション (.dacpac) ファイル

ダイアログには、次の参照場所から選択できるドロップダウン リストも表示されます。

  • 同じデータベース
  • 別のデータベース、同じサーバー
  • 別のデータベース、別のサーバー

SQL プロジェクトにプロジェクト参照を追加するには、データベース参照ごとに適切な参照項目を含む <ItemGroup> ファイルに .sqlproj 項目を追加します。 たとえば、次のプロジェクト参照は SQL プロジェクトに追加され、別のサーバーにある別のデータベース内の WorldWideImporters プロジェクトが参照されます。

  <ItemGroup>
    <ProjectReference Include="..\Contoso\WorldWideImporters.sqlproj">
      <Name>WorldWideImporters</Name>
      <Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <ServerSqlCmdVariable>WWIServer</ServerSqlCmdVariable>
      <DatabaseSqlCmdVariable>WorldWideImporters</DatabaseSqlCmdVariable>
    </ProjectReference>
  </ItemGroup>

プロジェクト参照は、SQL プロジェクトのサンプル ビュー定義に使用されます。

CREATE VIEW dbo.WorldWide_Products
AS
SELECT ProductID, ProductName, SupplierID
FROM [$(WWIServer)].[$(WorldWideImporters)].[Purchasing].[Suppliers]

SQL データベース プロジェクト 拡張機能で SQL プロジェクトにデータベース参照を追加するには、[データベース プロジェクト] ビューのプロジェクトの下にある [データベース参照] ノードを右クリックし、[データベース 参照の追加] を選択します。

Visual Studio Code の [参照の追加] ダイアログのスクリーンショット。

利用可能な参照型は次のとおりです。

  • システム データベース
  • データ層アプリケーション (.dacpac)
  • 公開されたデータ層アプリケーション (.nupkg)
  • プロジェクト

拡張機能は、次の参照場所から選択するようにも求めます。

  • 同じデータベース
  • 別のデータベース、同じサーバー
  • 別のデータベース、別のサーバー

SQL プロジェクトにプロジェクト参照を追加するには、データベース参照ごとに適切な参照項目を含む <ItemGroup> ファイルに .sqlproj 項目を追加します。 たとえば、次のプロジェクト参照は SQL プロジェクトに追加され、別のサーバーにある別のデータベース内の WorldWideImporters プロジェクトが参照されます。

  <ItemGroup>
    <ProjectReference Include="..\Contoso\WorldWideImporters.sqlproj">
      <Name>WorldWideImporters</Name>
      <Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <ServerSqlCmdVariable>WWIServer</ServerSqlCmdVariable>
      <DatabaseSqlCmdVariable>WorldWideImporters</DatabaseSqlCmdVariable>
    </ProjectReference>
  </ItemGroup>

プロジェクト参照は、SQL プロジェクトのサンプル ビュー定義に使用されます。

CREATE VIEW dbo.WorldWide_Products
AS
SELECT ProductID, ProductName, SupplierID
FROM [$(WWIServer)].[$(WorldWideImporters)].[Purchasing].[Suppliers]

SQL プロジェクトにプロジェクト参照を追加するには、データベース参照ごとに適切な参照項目を含む <ItemGroup> ファイルに .sqlproj 項目を追加します。 たとえば、次のプロジェクト参照は SQL プロジェクトに追加され、別のサーバーにある別のデータベース内の WorldWideImporters プロジェクトが参照されます。

  <ItemGroup>
    <ProjectReference Include="..\Contoso\WorldWideImporters.sqlproj">
      <Name>WorldWideImporters</Name>
      <Project>{d703fc7a-bc47-4aef-9dc5-cf01094ddb37}</Project>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <ServerSqlCmdVariable>WWIServer</ServerSqlCmdVariable>
      <DatabaseSqlCmdVariable>WorldWideImporters</DatabaseSqlCmdVariable>
    </ProjectReference>
  </ItemGroup>

プロジェクト参照は、SQL プロジェクトのサンプル ビュー定義に使用されます。

CREATE VIEW dbo.WorldWide_Products
AS
SELECT ProductID, ProductName, SupplierID
FROM [$(WWIServer)].[$(WorldWideImporters)].[Purchasing].[Suppliers]

プロジェクト参照を使用してビルドする

データベース参照を使用して SQL プロジェクトをビルドするには、参照先オブジェクトがビルド プロセス中に確実に利用可能できるようにするため、追加の構成が必要になる場合があります。 たとえば、継続的インテグレーション (CI) パイプラインでプロジェクトをビルドする場合は、ローカル開発環境と同様にビルド エージェント環境を設定する必要があります。

  • SQL プロジェクト内の .dacpac 参照には、プロジェクト ファイルで指定されているとおりの同じ相対ファイル パスにあるビルド エージェントに .dacpac が存在する必要があります。
  • SQL projectのProject参照では、project ファイルで指定されているのと同じ相対ファイル パスにあるビルド エージェントに参照projectが存在し、ビルド エージェントで正常にビルドできる必要があります。
  • Visual Studioの元の SQL プロジェクトで作成されたシステム データベース参照には、ビルド エージェントがVisual Studioインストールされている必要があります。
  • SQL プロジェクトの NuGet パッケージ参照には、ビルド エージェントのパッケージ ソースとしても設定されている NuGet フィードにパッケージを発行する必要があります。

プロジェクト参照を使用して発行

データベース参照を使用してプロジェクトからビルドされた .dacpac を発行する場合、追加の手順は必要ありません。 .dacpac ファイルには、参照先オブジェクトと、プロジェクト ファイルで指定された SQLCMD 変数が含まれています。

同じデータベース内のオブジェクトへのデータベース参照には、参照先プロジェクトのオブジェクトは .dacpac ファイルに含まれますが、既定では配置には含まれません。 配置にオブジェクトを含めるには、SqlPackage コマンド ライン ツールの /p:IncludeCompositeObjects=true オプションを使用します。 たとえば、次のコマンドは AdventureWorks オプションを使用して /p:IncludeCompositeObjects=true プロジェクトを配置し、データベース参照から AdventureWorks にオブジェクトを含めます。

sqlpackage /Action:Publish /SourceFile:AdventureWorks.dacpac /TargetConnectionString:{connection_string_here} /p:IncludeCompositeObjects=true

(同じまたは異なるサーバー上の) 別のデータベースへのデータベース参照を含む .dacpac ファイルを配置する場合は、プロジェクト ファイルで指定された SQLCMD 変数をターゲット環境の正しい値に設定します。 SqlPackage コマンド ライン ツールの /v オプションを使用して、デプロイ時に SQLCMD 変数の値を設定します。 たとえば、次のコマンドは WorldWideImporters 変数を WorldWideImporters に設定し、WWIServer 変数を localhost に設定します。

sqlpackage /Action:Publish /SourceFile:AdventureWorks.dacpac /TargetConnectionString:{connection_string_here} /v:WorldWideImporters=WorldWideImporters /v:WWIServer=localhost