2015-04-20 12 views
6

Sto utilizzando SSDT (e sqlproj) per i nostri progetti MSSQL. Abbiamo alcune variabili che dobbiamo impostare quando pubblichiamo su ogni ambiente.Come rendere SSDT Profile.xml SqlCmdVariable una stringa vuota o facoltativa

Questo funziona perfettamente nella maggior parte dei nostri ambienti in cui assegniamo valori a tutte le variabili, ma quando pubblichiamo nel nostro database live, vorrei poter rendere DomainPrefix una stringa vuota. si è verificato "un errore durante la generazione del piano di distribuzione di distribuzione non può continuare valori mancanti per le seguenti variabili Sqlcmd::

Quando provo a modificare il Live.profile.xml per impostare DomainPrefix o nessun valore ottengo l'errore.. DomainPrefix. "

questo quello che vorrei il Live.profile.xml a guardare come:

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

Qualcuno sa come impostare uno SqlCmdVariable su un valore vuoto o fanno una variabile facoltativa?

Usando:

  • VS 2013 sqlproj
  • SqlPackage.exe per eseguire il pubblicare al DB da linea di comando
+0

Come stai usando DomainPrefix? È quella parte degli script Pre/Post, utilizzata all'interno di oggetti/codice, nomi di server, qualcos'altro?Se la utilizzi solo per gli script Pre/Post, potresti essere in grado di manipolare tali script di conseguenza con una sezione Production che è leggermente diversa. –

+0

DomainPrefix in particolare viene utilizzato in uno script di post e abbiamo un codice per gestirlo - ma è anche una delle numerose variabili che vogliamo impostare come una stringa vuota, quindi sarebbe bene sapere se c'è un modo per fare è vuoto/opzionale. – Saan

+0

Non sono a conoscenza di alcun modo per farlo, motivo per cui volevo assicurarmi che lo stavi usando solo in uno script Post. Puoi verificare un certo valore (ad es. "Prod") e renderlo vuoto se questo è il caso e/o creare una sezione per Produzione. Penso che fare MS non consideri mai una variabile vuota, perché ciò potrebbe causare il caos se usato all'interno del codice, specialmente per i nomi di DB. –

risposta

2

non sembra essere un modo di passare attraverso un NullOrWhiteSpace stringa come SqlCmdVariable. La sintassi di base per SqlCmdVariable è:

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

Sia Value o DefaultValue ha bisogno di avere un certo valore spazio non-bianco.

Quindi, per la prima opzione, come suggerito da @Peter in un commento sulla domanda, è possibile gestirlo nello script SQL di post distribuzione testando un valore specifico, ad esempio <Live> o qualsiasi altra cosa. Fare qualcosa di simile al seguente:

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

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

E poi basta concatenare @DomainPrefix alle corde invece di includere $(DomainPrefix) in loro.

Ovviamente, se è necessario che la variabile SQLCMD sia disponibile nel contesto T-SQL principale e non solo come variabile T-SQL (ad esempio, se si utilizza questo come un server collegato o un prefisso del database lungo il linee di UPDATE $(DomainPrefix)[DatabaseName].[dbo].[TableName]... dove $(DomainPrefix) viene solitamente definita come [LinkedServerName].), allora si dovrebbe essere in grado di ottenere via con usando un Value di /**/ (o anche /* Live */) in modo che il risultante T-SQL sarebbe interpretato come:

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

oppure:

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

entrambi sono validi T-SQL e funzionano. Quindi in questo caso dovresti utilizzare quanto segue:

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

Intelligente e posso vedere come ciò potrebbe aggirare il problema. Questa è una delle ragioni per cui stavo cercando di capire dove stavi usando la variabile e per quale scopo. :) –

+0

@PeterSchott Grazie :-). Tuttavia, io non sono l'O.P. ;-) –

Problemi correlati