.net Sql Package Exe能否在命令行中运行部署后脚本?

.net Sql Package Exe能否在命令行中运行部署后脚本?,.net,sql-server,sql-server-2017,sqlpackage,.net,Sql Server,Sql Server 2017,Sqlpackage,下面将使用sqlpackage.exe部署Sql数据库。 这不需要使用发布配置文件Xml。有没有一种方法可以内联添加简单的部署后脚本,而无需外部部署后文件 例如:将以内联方式发布数据库,而不使用发布配置文件xml SqlPackage.exe /Action:Publish /SourceFile:TestDatabase.dacpac /TargetDatabaseName:TestDb /TargetServerName:localhost 现在,我们的目标是在命令行中添加部署后脚本,

下面将使用sqlpackage.exe部署Sql数据库。 这不需要使用发布配置文件Xml。有没有一种方法可以内联添加简单的部署后脚本,而无需外部部署后文件

例如:将以内联方式发布数据库,而不使用发布配置文件xml

SqlPackage.exe 
/Action:Publish 
/SourceFile:TestDatabase.dacpac
/TargetDatabaseName:TestDb
/TargetServerName:localhost
现在,我们的目标是在命令行中添加部署后脚本,例如在示例表中插入值

预期目标:

SqlPackage.exe 
/Action:Publish 
/SourceFile:TestDatabase.dacpac
/TargetDatabaseName:TestDb
/TargetServerName:localhost
/PostDeploymentScript:"insert into dbo.SampleTable (SampleColumn) values ('1')"
在Microsoft网站中找不到部署后脚本内联选项。也许它不存在

更新(Steve Ford下面的答案可能不起作用):


要在没有任何外部文件的情况下从命令提示符执行此操作。Steve answer可能不适用于我的情况/问题。

添加部署后脚本的方法要求您将其添加到项目中

请参见此处的Microsoft文档:

要使用解决方案资源管理器添加和修改部署前或部署后脚本,请展开数据库项目以显示“脚本”文件夹

右键单击脚本文件夹并选择添加

在关联菜单中选择脚本

选择部署前脚本或部署后脚本。(可选)指定非默认名称。单击“添加”完成

双击脚本文件夹中的文件

Transact-SQL编辑器打开,显示文件的内容

您可以在脚本中使用SQLCMD语法和变量,并在数据库项目属性中设置它们。例如:

可以使用SQLCMD语法在部署前或部署后脚本中包含文件内容。包含文件并按照您定义的顺序运行::r。\myfile.sql

可以使用SQLCMD语法引用部署后脚本中的变量。您可以在项目属性或发布配置文件中设置SQLCMD变量:

:setvar TableName MyTable  
insert into [$(TableName)] (SampleColumn) values ('1')   

当你问具体的答案时,最好解释一下你到底想要达到什么目标以及为什么。您可能会坚持使用特定的解决方案来解决一个可以用多种不同方式解决的问题

你想解决的真正问题是什么。如果问题在于post/pre脚本总是执行,那么您可能需要编写幂等脚本或使用一些只执行该脚本一次的功能。你可以看看我的答案

如果您有其他这样做的原因,那么您也可以通过调用sqlcmd实用程序或任何其他可以从文件中执行语句并在sqlpackage之后立即运行此实用程序来实现

现在回答你最初的问题。如果您只想创建新变量,比如说ReplaceVariable,并在post脚本中添加一行,则需要执行以下操作:

$(ReplaceVariable)
然后跑

sqlpackage.exe 
   /Action:Publish        
   /SourceFile:"Database1.dacpac" 
   /TargetDatabaseName:TestDb 
   /TargetServerName:localhost 
   /Variables:ReplaceVariable="insert into a values (1);"

如果不需要执行任何操作,只需将“-”之类的内容作为参数传递。

我希望在没有任何外部命令的情况下从命令提示符执行此操作files@MattSmith没有外部文件,它们包含在DacPac see和hi@SteveFord中,我知道这可以通过数据库项目部署后脚本完成,但是,这需要通过命令行执行,所有操作,例如以下SqlPackage.exe/Action:Publish/SourceFile:TestDatabase.dacpac/TargetDatabaseName:TestDb/TargetServerName:localhost/PostDeploymentScript:“插入dbo.SampleTable(SampleColumn)值('1'))@SteveFord对您的问题有一个正确的解决方案。sqlpackage不会从命令行执行任何其他脚本。如果您不想从sqlpackage多次执行同一脚本,请在dml脚本中添加If stmt或使用合并stmt,您还应该试着解释为什么在项目中使用dml脚本不是一个可接受的解决方案。如果要添加从命令行运行的其他脚本,可以使用sqlcmd或使用dbup或类似工具切换到部署。这将通过命令行执行。SQLPackage生成一个脚本,它将执行该脚本以进行更改,添加到项目中的任何部署前或部署后脚本都将包含在此生成的scri中pt并作为一个整体执行,即SQLPackage将执行它,您将不需要执行任何操作,除了:SQLPackage.exe/Action:Publish/SourceFile:TestDatabase.dacpac/TargetDatabaseName:TestDb/TargetServerName:localHost查看我对我的回答的评论为什么不能创建正常的post脚本并将其存储为文件?如果这不是一个选项,那么为什么不能使用jus我不想在sqlpackage完成后直接使用sqlcmd运行这个insert语句?hi@DmitrijKultasev只是想知道这个选项是否存在,我想你可以用部署贡献者做些什么,但我从来没有听说过这样的本机功能。你能解释一下为什么使用sqlpackage可能不起作用吗您需要的唯一文件是dacpac文件。除了dacpac之外,没有其他文件。部署后脚本是dacpac的一部分。好的,谢谢,我仍然需要一个post脚本,但可能没有解决方案,只有命令行类型的人员,好的,谢谢