如何通过T-SQL向SQL Server 2019导入数据层应用.bacpac文件
核心结论
不存在与RESTORE DATABASE对等的原生T-SQL语句,可以直接导入.bacpac文件至SQL Server 2019环境。.bacpac是数据层应用(DAC)的逻辑导出包,本质是封装了库表结构、行数据、DAC元数据的压缩归档文件,不属于SQL Server引擎原生识别的备份介质。数据库引擎本身没有内置解析、还原.bacpac格式的逻辑,常规的RESTORE DATABASE语句仅支持.bak原生备份、差异备份、事务日志备份、数据库快照等引擎原生格式,无法识别.bacpac文件结构,强行使用会报备份介质无效的错误。
T-SQL上下文内的可行实现方案
虽然没有纯原生T-SQL的导入命令,但可以通过SQL Server的扩展存储过程调用官方命令行工具,实现不依赖SSMS向导、直接在T-SQL脚本中完成导入的效果,操作步骤如下:
- 提前在SQL Server所在服务器部署官方的SqlPackage工具,这是微软官方用于处理dacpac/bacpac包的命令行组件,默认安装路径通常为
C:\Program Files\Microsoft SQL Server\160\DAC\bin\SqlPackage.exe(不同版本路径中的版本号数字可能有差异) - 若实例未开启
xp_cmdshell扩展存储过程,先执行以下脚本开启(生产环境启用前需评估对应安全风险):
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'xp_cmdshell', 1; RECONFIGURE; GO
- 执行以下T-SQL脚本,通过
xp_cmdshell调用SqlPackage完成.bacpac导入,使用前替换脚本中的路径、实例名、库名参数为实际值:
DECLARE @SqlPackagePath NVARCHAR(500) = N'C:\Program Files\Microsoft SQL Server\160\DAC\bin\SqlPackage.exe'; DECLARE @BacpacFilePath NVARCHAR(500) = N'D:\DBBackup\source_db.bacpac'; DECLARE @TargetInstance NVARCHAR(200) = N'localhost'; DECLARE @TargetDBName NVARCHAR(200) = N'Imported_TestDB'; DECLARE @ExecCommand NVARCHAR(MAX); SET @ExecCommand = N'"' + @SqlPackagePath + N'"' + N' /Action:Import' + N' /SourceFile:"' + @BacpacFilePath + N'"' + N' /TargetServerName:"' + @TargetInstance + N'"' + N' /TargetDatabaseName:"' + @TargetDBName + N'"' + N' /TargetEncryptConnection:False'; EXEC xp_cmdshell @ExecCommand; GO
注意:若生产环境安全规则禁止开启
xp_cmdshell,则无法在纯T-SQL会话内独立完成.bacpac导入,需要通过PowerShell、CMD等脚本环境直接调用SqlPackage实现同等效果。
内容的提问来源于stack exchange,提问作者Ken Bonnin Jr
相关产品推荐
相关产品推荐

