将原始 SQL 项目转换为 SDK 样式项目

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

创建新的 SDK 样式 SQL 项目是一项快速任务。 但是,如果有现有的 SQL 项目,则可以将其转换为 SDK 样式的 SQL 项目,以利用新功能。

转换项目后,可以使用 SDK 样式项目的新功能,例如:

  • 跨平台生成支持
  • 简化的项目文件格式
  • 包引用

若要仔细完成转换,我们将:

  1. 创建原始项目文件的备份。
  2. 从原始项目生成 .dacpac 文件以进行比较。
  3. 将项目文件修改为 SDK 样式的项目。
  4. 从修改的项目生成 .dacpac 文件以进行比较。
  5. 验证 .dacpac 文件是否相同。

Visual Studio 中的 SQL Server Data Tools (SSDT) 不支持 SDK 样式的项目。 转换后,必须使用下列任一项来生成或编辑项目:

  • 命令行
  • Visual Studio Code 中的 SQL 数据库项目扩展
  • Azure Data Studio 中的 SQL 数据库项目扩展

先决条件

步骤 1:创建原始项目文件的备份

在转换项目之前,请创建原始项目文件的备份。 这样,可以根据需要还原到原始项目。

在文件资源管理器中,为要使用文件扩展名末尾追加的 .sqlproj 转换的项目创建 .original 文件的副本。 例如,MyProject.sqlproj 将变为 MyProject.sqlproj.original

步骤 2:从原始项目生成 .dacpac 文件以进行比较

在 VVisual Studio 2022 中打开项目。 文件 .sqlproj 仍采用原始格式,因此在原始 SQL Server Data Tools 中将其打开。

通过右键单击“解决方案资源管理器”中的数据库节点并选择“生成”在 Visual Studio 中生成该项目。

要从原始项目生成 .dacpac 文件,必须使用 Visual Studio 中的原始 SQL Server Data Tools (SSDT)。 在安装了原始 SQL Server Data Tools 的 Visual Studio 2022 中打开项目文件。

通过右键单击“解决方案资源管理器”中的数据库节点并选择“生成”在 Visual Studio 中生成该项目。

在 VS Code 或 Azure Data Studio 中打开项目文件夹。 在 VS Code 或 Azure Data Studio 的“数据库项目”视图中,右键单击项目节点并选择“生成”

可以使用 dotnet build 命令从命令行中生成 SQL 数据库项目。

dotnet build

# optionally specify the project file
dotnet build MyDatabaseProject.sqlproj

默认情况下,生成过程会在项目的 bin\Debug 文件夹中创建一个 .dacpac 文件。 使用文件资源管理器,找到生成过程创建的 .dacpac,并将其复制到项目目录之外的新文件夹中,作为 original_project.dacpac。 我们使用此 .dacpac 文件进行比较,以便稍后验证转换。

步骤 3:将项目文件修改为 SDK 样式的项目

修改项目文件是一个手动过程,最好是在文本编辑器中执行。 在文本编辑器中打开 .sqlproj 文件并进行以下更改:

必需:添加 SDK 引用

在项目元素中,添加一个 Sdk 项以从 https://www.nuget.org/packages/Microsoft.build.sql 中引用 Microsoft.Build.Sql 和最新版本。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0">
  <Sdk Name="Microsoft.Build.Sql" Version="0.2.0-preview" />
...

必需:删除不必要的生成目标导入

原始 SQL 项目引用 Import 语句中的多个生成目标和属性。 除了显式添加的 <Import/> 项目(这是唯一且经过深思熟虑的更改)外,删除以 <Import ...> 开头的行。 要删除的示例(如果显示在 .sqlproj 中):

...
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Condition="..." Project="...\Microsoft.Data.Tools.Schema.SqlTasks.targets"/>
<Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
<Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
...

必需:删除“属性”文件夹

原始 SQL 项目具有表示对解决方案资源管理器中项目属性的访问权限的 Properties 文件夹的条目。 此项目需要从项目文件中删除。

要删除的示例(如果显示在 .sqlproj 中):

<ItemGroup>
  <Folder Include="Properties" />
</ItemGroup>

可选:删除 SSDT 引用

原始 SQL Server Data Tools (SSDT) 需要项目文件中的额外内容来检测 Visual Studio 安装程序。 这些行在 SDK 样式的 SQL 项目中是不必要的,可以删除:

  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
    <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
    <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
  </PropertyGroup>

可选:删除默认的生成设置

原始 SQL 项目包括两个用于发布和调试生成设置的大型块,而在 SDK 样式的 SQL 项目中,这些选项的默认值被 SDK 已知。 如果没有对生成设置进行自定义,请考虑删除以下块:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <OutputPath>bin\Release\</OutputPath>
    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>
    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <DefineDebug>false</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <OutputPath>bin\Debug\</OutputPath>
    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>

步骤 4:从修改的项目生成 .dacpac 文件以进行比较

SQL 项目不再与 Visual Studio 2022 兼容。 若要生成或编辑项目,必须使用以下各项之一:

  • 命令行
  • Visual Studio Code 中的 SQL 数据库项目扩展
  • Azure Data Studio 中的 SQL 数据库项目扩展

项目文件现在采用 SDK 式格式,但要在 Visual Studio 2022 中打开项目文件,必须安装 SDK 式 SQL Server Data Tools(预览版),并且该项目的文件扩展名必须为 .sqlprojx。 在安装了 SDK 式 SQL Server Data Tools(预览版)的 Visual Studio 2022 中打开该项目。

在 VS Code 或 Azure Data Studio 中打开项目文件夹。 在 VS Code 或 Azure Data Studio 的“数据库项目”视图中,右键单击项目节点并选择“生成”

可以使用 dotnet build 命令从命令行中生成 SQL 数据库项目。

dotnet build

# optionally specify the project file
dotnet build MyDatabaseProject.sqlproj

默认情况下,生成过程会在项目的 bin\Debug 文件夹中创建一个 .dacpac 文件。 使用文件资源管理器,找到生成过程创建的 .dacpac,并将其复制到项目目录外部的新文件夹中。 我们使用此 .dacpac 文件进行比较,以便稍后验证转换。

步骤 5:验证 .dacpac 文件是否相同

若要验证转换是否成功,请比较从原始项目和修改的项目创建的 .dacpac 文件。 SQL 项目的架构比较功能使我们能够直观显示数据库模型的差异。

可以使用 Visual Studio、Visual Studio Code 或 Azure Data Studio 中的架构比较工具来比较 .dacpac 文件。 还提供有基于 DacFx .NET 库的社区工具。

在未加载项目的情况下启动 Visual Studio。 转到“工具”>“SQL Server”>“新架构比较”。 选择原始 .dacpac 文件作为源,修改后的 .dacpac 文件作为目标。 有关在 Visual Studio 中使用架构比较的详细信息,请参阅使用架构比较来比较不同的数据库定义

Visual Studio 中的 SDK 式 SQL 项目预览版中尚不提供图形架构比较功能。 使用 Azure Data Studio 比较架构。

Visual Studio Code 中不提供架构比较。 使用 Azure Data Studio 或 Visual Studio 比较架构。

在 Azure Data Studio 中,如果尚未安装 SQL Server 架构比较扩展,请安装它。 通过使用 Ctrl/Cmd+Shift+P 打开命令面板并键入 Schema Compare,从命令面板中启动新的架构比较。

选择原始 .dacpac 文件作为源,修改后的 .dacpac 文件作为目标。

Visual Studio 和 Azure Data Studio 中提供了图形架构比较。

运行架构比较时,不应显示任何结果。 缺少差异表示原始项目和修改的项目是等效的,在 .dacpac 文件中生成相同的数据库模型。

注意

通过架构比较对 .dacpac 文件进行比较不会验证预先部署/后期部署脚本、重构或其他项目设置。 它仅会验证数据库模型。 将 .dacpac 转换为 .zip 存档并手动比较内容可提供更详细的比较。