【问题标题】:How to make SSDT Profile.xml SqlCmdVariable an empty string or optional如何使 SSDT Profile.xml SqlCmdVariable 为空字符串或可选
【发布时间】:2015-04-20 10:50:20
【问题描述】:

我在我们的 MSSQL 项目中使用 SSDT(和 sqlproj)。在发布到每个环境时,我们需要设置一些变量。

这在我们为所有变量分配值的大多数环境中都非常有效,但是当我们发布到我们的实时数据库时,我希望能够将 DomainPrefix 设为空白字符串。

当我尝试更改 Live.profile.xml 以将 DomainPrefix 设置为无值时,我收到错误: “生成部署计划时出错。部署无法继续。以下 SqlCmd 变量缺少值:DomainPrefix。”

这就是我希望 Live.profile.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
  <PropertyGroup>
    <TargetDatabaseName>DB_NAME</TargetDatabaseName>
    <DeployScriptFileName>DB_NAME.sql</DeployScriptFileName>
    <TargetConnectionString>CONNECTION_STRING</TargetConnectionString>
    <ProfileVersionNumber>1</ProfileVersionNumber>
  </PropertyGroup>
  <ItemGroup>
    <SqlCmdVariable Include="DomainPrefix">
      <Value></Value>
    </SqlCmdVariable>
    <SqlCmdVariable Include="Environment">
      <Value>live</Value>
    </SqlCmdVariable>
  </ItemGroup>
</Project>

有谁知道如何将 SqlCmdVariable 设置为空值或使其成为可选变量?

使用:

  • VS 2013 sqlproj
  • SqlPackage.exe 从命令行运行发布到数据库

【问题讨论】:

  • 您如何使用域前缀?是前/后脚本的一部分,在对象/代码中使用,服务器名称,还是别的?如果您仅将其用于 Pre/Post 脚本,则可以通过稍微不同的 Production 部分相应地操作这些脚本。
  • DomainPrefix 专门用于发布脚本,我们确实有一些代码来处理它 - 但它也是我们想要设置为空白字符串的几个变量之一,所以最好知道是否有办法将其设为空白/可选。
  • 我不知道有什么方法可以做到这一点,这就是为什么我想确保您只在 Post 脚本中使用它。如果是这种情况,您可以检查某些值(例如“Prod”)并将其设为空白和/或为生产创建一个部分。我认为让 MS 永远不会考虑一个空白变量,因为如果在代码中使用它可能会造成严重破坏,尤其是对于数据库名称。
  • 我不认为有一个简单的选择,除非你开始破解它,在这里阅读更多:blogs.msdn.com/b/sql_server_appendix_z/archive/2013/02/23/…
  • @PeterSchott 和 Saan,我发布了一个应该可以解决该问题的答案,以及对如何使用此变量的 2 种不同解释。

标签: sql-server sql-server-data-tools sqlcmd sqlpackage sqlproj


【解决方案1】:

似乎没有任何方法可以将NullOrWhiteSpace 字符串作为SqlCmdVariable 传递。 SqlCmdVariable 的基本语法是:

<SqlCmdVariable Include="DomainPrefix">
  <DefaultValue>
  </DefaultValue>
  <Value></Value>
</SqlCmdVariable>

ValueDefaultValue 需要有一些非空白值。

因此,对于您的第一个选项,正如 @Peter 在对该问题的评论中所建议的那样,您可以通过测试特定值(例如 &lt;Live&gt; 或其他任何值)在部署后 SQL 脚本中处理此问题。执行以下操作:

DECLARE @DomainPrefix NVARCHAR(50) = N'$(DomainPrefix)';

IF (@DomainPrefix = N'<Live>')
BEGIN
  SET @DomainPrefix = '';
END;

然后只需将@DomainPrefix 连接到字符串,而不是在其中包含$(DomainPrefix)

当然,如果您需要 SQLCMD 变量在主 T-SQL 上下文中可用,而不仅仅是作为 T-SQL 变量(例如,如果您将其用作链接服务器或数据库前缀) UPDATE $(DomainPrefix)[DatabaseName].[dbo].[TableName]...$(DomainPrefix) 通常定义为 [LinkedServerName]. ),那么您应该能够使用 Value/**/ (甚至 /* Live */ ),这样生成的 T-SQL 将解释为:

UPDATE [LinkedServerName].[DatabaseName].[dbo].[TableName]...

或:

UPDATE /* Live */[DatabaseName].[dbo].[TableName]...

它们都是有效的 T-SQL 并且可以工作。因此,在这种情况下,您将使用以下内容:

<SqlCmdVariable Include="DomainPrefix">
  <Value>/* Live */</Value>
</SqlCmdVariable>

【讨论】:

  • 聪明,我知道如何解决您的问题。这就是我试图弄清楚你在哪里使用变量以及用于什么目的的原因之一。 :)
  • @PeterSchott 谢谢:-)。但是,我不是 O.P. ;-)
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2018-08-11
  • 2022-01-06
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多