如何使SSDT Profile.xml SqlCmdVariable为空字符串或可选

Saa*_*aan 7 sql-server sqlcmd sqlproj sqlpackage sql-server-data-tools

我正在为我们的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>
Run Code Online (Sandbox Code Playgroud)

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

使用:

  • VS 2013 sqlproj
  • SqlPackage.exe从命令行运行发布到DB

Sol*_*zky 3

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

<SqlCmdVariable Include="DomainPrefix">
  <DefaultValue>
  </DefaultValue>
  <Value></Value>
</SqlCmdVariable>
Run Code Online (Sandbox Code Playgroud)

要么Value要么DefaultValue需要具有一些非空白值。

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

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

IF (@DomainPrefix = N'<Live>')
BEGIN
  SET @DomainPrefix = '';
END;
Run Code Online (Sandbox Code Playgroud)

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

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

UPDATE [LinkedServerName].[DatabaseName].[dbo].[TableName]...
Run Code Online (Sandbox Code Playgroud)

或者:

UPDATE /* Live */[DatabaseName].[dbo].[TableName]...
Run Code Online (Sandbox Code Playgroud)

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

<SqlCmdVariable Include="DomainPrefix">
  <Value>/* Live */</Value>
</SqlCmdVariable>
Run Code Online (Sandbox Code Playgroud)