【问题标题】:Dynamic values to SQLCMD variable: SetvarSQLCMD 变量的动态值:Setvar
【发布时间】:2020-06-15 15:37:51
【问题描述】:

我正在使用 Visual Studio 2017 数据库项目 (Dacpac),并且我在发布文件(在 xml 文件中)中有一些 SQLCMD 变量,如下所示-

<SqlCmdVariable Include="ClientDBName">
  <Value>Client_1</Value>
</SqlCmdVariable>

我的问题是,我们有多个客户端,并且我们正在一次为多个客户端部署 dacpac 的数据库更改。因此,如果我像上面的示例一样为我的 SQLCMD 变量“ClientDBName”分配静态值,它将为所有客户端采用相同的值(相同的数据库名称“Client_1”)。

为了解决这个问题,我正在使用 PreDeployment 脚本。我试图将动态值或数据库名称分配给 SQLCMD 变量“CleintDBName”。如下-

 DECLARE @dbname varchar(50)  
 SET @dbName = "xyz"  
:setvar ClientDBName @dbName

但这不起作用。我探索了它,发现这行不通。我尝试做的另一种方法是通过调用下面的脚本来分配 dbname 值-

:setvar ClientDBName "C:\GetDatabaseName.sql"

但这也行不通。

那么任何人都可以帮我解决这个问题,我们如何将动态值分配给 SQLCMD 变量?

【问题讨论】:

  • @DanGuzman,你能举个例子吗?
  • 除了指定要部署到哪个数据库之外,您还使用该客户端/数据库名称做什么?您可以使用“生成脚本”选项,然后将该脚本推送到多个数据库吗?
  • @PeterSchott,我不知道“生成脚本”选项。你能告诉我更多关于它的细节吗?
  • 如果您在 VS 项目中,请选择“脚本”选项,而不是单击“发布”。如果您使用的是 sqlpackage,则有一个命令行选项可以生成脚本,而不是推送更改。请记住,由于变量,您需要在 SQLCMD 模式下运行该脚本。 docs.microsoft.com/en-us/sql/tools/sqlpackage

标签: sql-server sqlcmd database-project


【解决方案1】:

下面的 sqlpackage 示例命令使用 /Variables: 参数指定 SQLCMD 值。使用这些值代替发布配置文件中的值。

SqlPackage.exe /Action:Publish /SourceFile:"YourDatabase.dacpac" /TargetDatabaseName:YourDatabaseName /TargetServerName:"." /Variables:"ClientDBName=YourValue"

如果您实际需要的是发布的数据库名称,您可以使用内置的DatabaseName SQLCMD 变量,而不是用户定义的 SQLCMD 变量,即/TargetDatabaseName 值。

【讨论】:

  • 但在我的情况下它不起作用,因为我有多个数据库,并且对于每个数据库执行,我都需要相应的值。但这里我们给出一个固定值。
  • @sunil,你不能简单地多次运行 sqlpackage,为每个客户端和不同的数据库名称运行一次吗?
  • 不,我不能...因为这是现有流程,我们试图通过仅在一次执行中执行每个数据库来更改它(因为有 N 个数据库)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多