2015-04-20 5 views
6

Ich verwende SSDT (und sqlproj) für unsere MSSQL-Projekte. Wir müssen einige Variablen festlegen, die bei der Veröffentlichung in jeder Umgebung festgelegt werden müssen.Wie mache ich SSDT Profile.xml SqlCmdVariable eine leere Zeichenfolge oder optional

Das funktioniert gut in den meisten unserer Umgebungen, wo wir allen Variablen Werte zuweisen, aber wenn wir in unserer Live-Datenbank veröffentlichen, würde ich gerne in der Lage sein, DomainPrefix eine leere Zeichenfolge zu machen.

Wenn ich versuche, die Live.profile.xml zu verändern DomainPrefix zu keinem Wert setzen ich den Fehler: „Ein Fehler bei der Bereitstellung Plangenerierung aufgetreten Deployment nicht fortgesetzt werden kann Fehlende Werte für die folgenden Variablen Sqlcmd:.. DomainPrefix. "

Das, was ich würde die Live.profile.xml mag aussehen:

<?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> 

Wer weiß, wie ein SqlCmdVariable auf einen leeren Wert zu setzen oder es sich um eine optionale Variable machen?

Verwendung:

  • VS 2013 sqlproj
  • SqlPackage.exe auf die an die DB von der Kommandozeile veröffentlichen laufen
+0

Wie verwenden Sie DomainPrefix? Ist das ein Teil von Pre/Post-Skripten, die in Objekten/Code, Namen von Servern oder etwas anderem verwendet werden?Wenn Sie nur das für Pre/Post-Skripte verwenden, können Sie diese Skripte möglicherweise mit einem etwas anderen Abschnitt für die Produktion bearbeiten. –

+0

DomainPrefix wird speziell in einem Post-Skript verwendet, und wir haben etwas Code, um damit umzugehen - aber es ist auch eine von mehreren Variablen, die wir als leere Zeichenfolge setzen wollen, also wäre es gut zu wissen, ob es einen Weg gibt es leer/optional. – Saan

+0

Mir ist keine Möglichkeit bekannt, weshalb ich sicherstellen wollte, dass Sie es nur in einem Post-Skript verwenden. Sie können nach einem Wert suchen (z. B. "Prod") und ihn leer lassen, wenn dies der Fall ist, und/oder einen Abschnitt für die Produktion erstellen. Ich denke, dass MS niemals eine leere Variable in Betracht zieht, denn das könnte zu Verwüstungen führen, wenn sie im Code verwendet wird, insbesondere für DB-Namen. –

Antwort

2

Es scheint keinen Weg zu geben, die durch einen NullOrWhiteSpace Zeichenfolge als SqlCmdVariable. Die grundlegende Syntax für SqlCmdVariable ist:

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

Entweder Value oder DefaultValue braucht einige nicht-weißen Raumwert zu haben.

Also, für Ihre erste Option, wie @Peter in einem Kommentar zu der Frage vorgeschlagen, können Sie dies in Ihrem Post Deployment SQL-Skript durch Testen für einen bestimmten Wert, wie <Live> oder was auch immer. Tun Sie etwas wie folgt aus:

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

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

Und dann verketten nur @DomainPrefix auf die Saiten statt einschließlich $(DomainPrefix) in ihnen.

Natürlich, wenn die SQLCMD-Variable im T-SQL-Hauptkontext verfügbar sein muss und nicht nur als T-SQL-Variable (wenn Sie diese beispielsweise als Verbindungsserver oder Datenbankpräfix entlang der Linien UPDATE $(DomainPrefix)[DatabaseName].[dbo].[TableName]... wo $(DomainPrefix) in der Regel als [LinkedServerName].) definiert ist, dann sollten Sie in der Lage sein, mit der Verwendung eines Value von /**/ (oder sogar /* Live */) so wegzukommen, dass die resultierende T-SQL interpretiert würde als entweder:

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

oder:

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

beide sind gültig T-SQL und arbeiten. In diesem Fall würden Sie Folgendes verwenden:

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

Clever und ich kann sehen, wie das um Ihr Problem herumkommen könnte. Das ist ein Grund, warum ich versucht habe herauszufinden, wo du die Variable verwendest und für welchen Zweck. :) –

+0

@PeterSchott Danke :-). Allerdings bin ich nicht der O.P. ;-) –

Verwandte Themen