数据库引用概述

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric SQL 数据库

通过链接到另一个项目、.dacpac 文件或已发布的 NuGet 包,可以使用 SQL 项目中的数据库引用来合并未包含在项目中的对象。 添加到项目的数据库对象可以是同一数据库的一部分、同一服务器上的不同数据库或者不同服务器上的不同数据库。 对于 SQL Server 开发,可以使用数据库引用链接到同一服务器上的另一个数据库以进行三部分命名,或链接到不同服务器上的不同数据库以进行跨数据库查询。 对于在不同组中具有大量对象的数据库,可以使用数据库引用将数据库分解成更小、更易于管理的项目。 较小的项目大小有助于提高性能,并减少在迭代本地开发期间生成项目所需的时间。

引用 dacpac、nuget 包和用于数据库引用的项目的 SQL 项目示例屏幕截图。

注意

项目引用和 NuGet 包引用是新开发中的数据库引用的建议方法。 原始 SQL 项目不支持引用 NuGet 包。

SQL 项目文件示例和语法

数据库引用通过 .sqlproj 文件中的条目包含在项目中,类似于 C# 项目。 当数据库引用指向同一服务器上的不同数据库时,项目引用中包含一个 <DatabaseSqlCmdVariable> 元素。 当数据库引用指向不同服务器上的不同数据库时,项目引用中也包含一个 <ServerSqlCmdVariable> 元素。 对同一数据库的数据库引用不包括 <ServerSqlCmdVariable><DatabaseSqlCmdVariable> 元素。

在 SQL 脚本中包含对数据库引用的特定引用将使用项目文件中命名的 SQLCMD 变量来指定数据库名称。 例如,以下 SQL 脚本引用 Warehouse 数据库中的表:

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

$(Warehouse) SQLCMD 变量对应的数据库引用包含在项目文件中并包含 <DatabaseSqlCmdVariable>Warehouse</DatabaseSqlCmdVariable>

项目引用

在此示例中,将项目引用添加到属于同一数据库的 SQL 项目 AdventureWorksSalesLT.sqlproj 中。

  <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 2022 的 master 系统数据库的包引用

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

Dacpac 项目引用

对于 SDK 样式项目中的新开发,不建议直接引用 .dacpac 项目文件。 请改用 NuGet 包引用

在原始 SQL 项目中,.dacpac 文件引用是在包含 <ArtifactReference> 项目的 .sqlproj 文件中指定的。 以下示例演示了对同一服务器上不同项目中的 .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 项目的数据库引用,请在“数据库项目”视图中的项目下右键单击“数据库引用”节点,然后选择“添加数据库引用”

Azure Data Studio 中“添加引用”对话框的屏幕截图。

可用的引用类型包括:

  • 系统数据库
  • 数据层应用程序 (.dacpac)
  • 发布的数据层应用程序 (.nupkg)
  • project

该扩展还会提示从以下引用位置中进行选择:

  • 相同数据库
  • 不同数据库,相同服务器
  • 不同数据库,不同服务器

若要向 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 项目中的项目引用要求引用的项目在生成代理上的位置必须与项目文件中指定的相对文件路径相同,且能够在生成代理上成功生成。
  • 在 Visual Studio 中的原始 SQL 项目中创建的系统数据库引用要求生成代理安装 Visual Studio。
  • SQL 项目中的 NuGet 包引用要求将包发布到 NuGet 源,该源也设置为生成代理的包源。

使用项目引用进行发布

发布使用数据库引用从项目生成的 .dacpac 不需要执行额外的步骤。 .dacpac 文件包含引用的对象和项目文件中指定的 SQLCMD 变量。

对于对同一数据库中的对象的数据库引用,引用的项目中的对象包含在 .dacpac 文件中,但默认情况下不包括在部署中。 若要在部署中包含对象,请使用 SqlPackage 命令行工具中的 /p:IncludeCompositeObjects=true 选项。 例如,以下命令使用 /p:IncludeCompositeObjects=true 选项部署 AdventureWorks 项目,以包含对 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