我正在为我们的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设置为空值或使其成为可选变量?
使用:
答案 0 :(得分:2)
似乎没有任何方式可以将NullOrWhiteSpace
字符串作为SqlCmdVariable
传递。 SqlCmdVariable
的基本语法是:
<SqlCmdVariable Include="DomainPrefix">
<DefaultValue>
</DefaultValue>
<Value></Value>
</SqlCmdVariable>
Value
或DefaultValue
需要有一些非空格值。
因此,对于您的第一个选项,正如@Peter在对该问题的评论中所建议的那样,您可以通过测试特定值(例如<Live>
或其他)来在Post Deployment 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 */
(甚至{{{{}} 1}})以便生成的T-SQL被解释为:
UPDATE [LinkedServerName].[DatabaseName].[dbo].[TableName]...
或:
UPDATE /* Live */[DatabaseName].[dbo].[TableName]...
这两个都是有效的T-SQL和工作。因此,在这种情况下,您将使用以下内容:
<SqlCmdVariable Include="DomainPrefix">
<Value>/* Live */</Value>
</SqlCmdVariable>