PowerShell Using **DacServices** With SQLCMD Variables To Deploy A DACPAC
Asked Answered
R

2

7

In PowerShell I'm using Microsoft.SqlServer.Dac.DacServices and Microsoft.SqlServer.Dac.DacDeployOptions to deploy/update a database DACPAC. The problem I am having is finding where to set the SQLCMD Variables the package requires.

Abbreviated Sample

# Create a DacServices object, which needs a connection string 
$dacsvcs = New-Object Microsoft.SqlServer.Dac.DacServices "server=$sqlserver"

# Load dacpac from file
$dp = [Microsoft.SqlServer.Dac.DacPackage]::Load($dacpac) 

# Deploy options
$deployOptions = New-Object Microsoft.SqlServer.Dac.DacDeployOptions
$deployOptions.IncludeCompositeObjects = $true

I know I can input these just fine with SqlPackage.exe, and maybe that's what I should do. But no where in the documentation or web grok can I find an example of DacServices usage with SQLCMD variables as an option--SQLCMD variables as required parameters for my project's DACPAC.

Rapallo answered 18/2, 2015 at 16:42 Comment(0)
W
10

You should set options in the $deployOptions.SqlCommandVariableValues property. This is an updateabase Dictionary - you can't assign a new dictionary but you can update the key/value pairs inside it. For example to set a variable "MyDatabaseRef" to "Database123" use

$deployOptions.SqlCommandVariableValues.Add("MyDatabaseRef", "Database123");

The API reference is here.

Willful answered 20/2, 2015 at 8:6 Comment(8)
I saw that reference as well, but SqlCmdVariables is readonly. Unless you know a way around that (reflection?) it won't work. My experience with PowerShell is limited in this regard.Rapallo
I've updated the answer to clarify that while you can't update the dictionary reference, you can set values within it. This should solve your issue.Willful
When I try that, I get 'Cannot index into a null array.' is there anything special that needs to be done to enable / create the SqlCmdVariables object?Wizardly
@KevinCunnane, using the Add method on SqlCommandVariablesValues works for me, so something like this should do it: $deployOptions.SqlCmdVariableValues.Add("MyDatabaseRef", "Database123")Varicose
@DavidPeters thank you - I have updated the answer to reflect this information. Appreciate the help!Willful
How can I use the same variable when I extract dacpac is there any option?Pelfrey
@Dotnet I don't believe that's supported. At the moment you'd need to import into a project and update there.Willful
I didn't get that can you let me know how can I overcome this, question on the same I posed here #43627568Pelfrey
M
0

I have another code snippet to share in relation to this, a method of processing multiple variables from a Powershell script argument;

param(
[hashtable] $SqlCmdVar
)

$deployOptions = New-Object Microsoft.SqlServer.Dac.DacDeployOptions

# Process the Sql Command Variables
#
if ($SqlCmdVar -ne $null)
{
    foreach($key in $SqlCmdVar.keys)
    {
        Write-Verbose -Message "Adding Sql Command Variable ""$key""..."

        $deployOptions.SqlCommandVariableValues.Add($key,$SqlCmdVar[$key])
    }
}

You would call the script like this;

myscript.ps1 -SqlCmdVar @{ variable1 = "my first value"; variable2 = "my second value"; variableetc = "more values"}
Messieurs answered 26/6, 2018 at 13:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.