T-SQL Post-Deployment脚本如何引用变量

时间:2017-03-17 16:18:50

标签: tsql sqlcmd dacpac dac

我使用以下部署后脚本1部署DACPAC:

ALTER DATABASE [$(DatabaseName)] 
MODIFY FILE (NAME = [$(DatabaseName)], 
             SIZE = 100MB, MAXSIZE = UNLIMITED, FILEGROWTH = 20%)

但是,当我尝试引用此部署后脚本2时,部署失败:

ALTER DATABASE [$(DatabaseName)] 
MODIFY FILE (NAME = [$(DatabaseName)], 
             SIZE = $(size), MAXSIZE = UNLIMITED, FILEGROWTH = 20%)

所以,我的问题是传递大小的正确语法是什么?

我使用此命令启动脚本(第一个脚本1工作,脚本2不工作)

$resourceGroup = "SQL1"
$vmName = "SQL1"
$storageName = "sql1artifactsstorage111"
$ConfigurationPath = "C:\DSC\Ext\deployDB.ps1"
$ConfigurationName = "deployDB"
$configurationArchive = "deployDB.ps1.zip"
#Publish the configuration script into user storage
Publish-AzureRmVMDscConfiguration -ConfigurationPath $ConfigurationPath -ResourceGroupName $resourceGroup -StorageAccountName $storageName -force
#Set the VM to run the DSC configuration
$configurationArguments = 
@{
    Credential = Get-Credential;
    DatabaseName = 'Database1' 
    size = '100MB'
}
Set-AzureRmVmDscExtension -Version 2.22 -Name dscExtension -ResourceGroupName $resourceGroup -VMName $vmName -ArchiveStorageAccountName $storageName -ArchiveBlobName $configurationArchive -AutoUpdate:$true -ConfigurationName $ConfigurationName -ConfigurationArgument $configurationArguments

这是DSC显示的错误:

Dac Deploy Failed: 'Exception calling "Deploy" 
with "3" argument(s): "An error occurred during deployment plan generation. 
Deployment cannot continue."'

1 个答案:

答案 0 :(得分:3)

动态SQL是恶棍的最后避难所:

EXEC ('ALTER DATABASE [$(DatabaseName)] MODIFY FILE (NAME = [$(DatabaseName)],SIZE = $(size), MAXSIZE = UNLIMITED, FILEGROWTH = 20%)');
GO

为我工作,虽然是在本地部署,而不是通过Azure DSC。

这是一种通用的技术,用于做这些" DBA-esque"通常不支持TSQL变量替换的活动。

请注意未来的读者:这个技巧显然有效,也就是说OP已将其标记为答案。但是,由于工作站和构建服务器之间的DacFX版本不同,仅可能只需要,例如参见another SO post relating to the same error message