将现有文件添加到 SQL 项目

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

作为一个概念,一旦创建了 SQL 项目,就可以一次或批量地向其中添加对象。 一次添加一个对象非常简单,而批量添加对象可以从 .dacpac 文件的内容或者一个或多个 SQL 脚本完成。 本文介绍了如何将 dacpac 或 SQL 脚本的内容添加到 SQL 项目以及源之间的权衡。

.dacpac 文件导入

.dacpac 文件是已编译的数据库模型,需要特定的工具来读取和应用该文件。 .dacpac 文件可以作为 SQL 项目生成工件生成,也可以从现有数据库生成,并且你可能会获得一个无法访问源的文件。 除了可以将 .dacpac 应用于数据库的众多工具之外,Visual Studio 中的 SQL Server Data Tools (SSDT) 还可以将 .dacpac 文件的内容直接导入到项目中。 仅当项目中没有定义任何架构对象时,才能从数据库或 .dacpac 文件导入架构。

Visual Studio SSDT 中 SQL 项目的导入菜单的屏幕截图。

导入时,将使用 SSDT 用于新对象的组织默认值通过脚本将对象定义写入项目文件,这些默认值是:顶层对象的新文件、与父级相同的文件中定义的层次结构子级、适用的内联对象中定义的表/列约束。 如果获得每个对象的更具针对性的可见性和控制,请使用“架构比较”而非“导入”。 如果导入源包含预先和后期部署脚本、RefactorLog 或 SQLCMD 变量定义,它们将导入项目。 如果该项目已包含这些项目中的任何一个,则导入的文件将添加到项目中的“导入时忽略”文件夹中。

如果 Visual Studio 和 SQL Server Data Tools 不可用,则可以:

  • 使用 Azure Data Studio 中的“架构比较”扩展将 .dacpac 文件的内容与项目进行比较,然后有选择地将更改应用于项目。
  • 使用 SqlPackage 命令行实用程序将 .dacpac 文件的内容导入数据库,然后从数据库创建项目

从 SQL 脚本导入

可通过两种方式将 T-SQL 脚本导入 SQL 项目:将脚本文件添加到项目目录或在 Visual Studio 中处理脚本的内容。 所选择的方法取决于项目类型和对导入过程所需的控制级别。 在这两种情况下,脚本文件的语法必须有效。

向项目添加文件

使用 SDK 样式的 SQL 项目,可以通过将现有 SQL 脚本放入项目目录中来将其添加到项目中,因为 Microsoft.Build.Sql 会自动包含项目中的任何 *.sql 文件。 如果使用非 SDK 样式的项目,则必须利用 Visual Studio 中的脚本处理将现有 SQL 脚本导入项目中。 项目中自动包含的 *.sql 文件作为 SQL 对象包含在数据库模型生成中。

添加到项目文件夹中的文件包含与项目中已存在的对象重复的对象定义,会导致项目生成失败。 需要通过删除重复的对象或重命名其中一个对象来手动解决冲突。

若要将文件作为预先/后期部署脚本添加到项目,除了将文件添加到项目目录外,还必须将该文件包含在项目文件中。 例如,若要将名为 Pre-DeploymentScript.sql 的文件作为预先部署脚本添加,请将以下内容添加到项目文件:

<ItemGroup>
  <PreDeploy Include="Pre-DeploymentScript.sql" />
</ItemGroup>

有关预先/后期部署脚本的详细信息,请参阅 SQL 项目文档。

处理文件的内容

Visual Studio 中的 SQL Server Data Tools (SSDT) 还能够处理 SQL 脚本的内容,同时将它们添加到原始样式的项目。 在此处理过程中,如果脚本包含项目中已定义的对象,则该对象的定义将更新以匹配脚本。 如果脚本包含项目中尚未定义的对象,则会为该对象创建新文件。

存在已知问题,即脚本处理可能会导致重复约束和加密密钥语句。 如果遇到这些问题,请使用生成输出窗口来确定重复项的来源,并手动将其从项目中删除。

“从脚本导入”过程不包含预先/后期部署脚本、SQLCMD 变量或 RefactorLog 文件。 这些项以及在导入时检测到的任何其他不支持的构造将放入项目中“脚本”文件夹的 ScriptsIgnoredOnImport.sql 文件。