2015-04-20 17 views
6

Używam SSDT (i sqlproj) dla naszych projektów MSSQL. Mamy kilka zmiennych, które musimy ustawić podczas publikowania w każdym środowisku.Jak zrobić SSDT Profile.xml SqlCmdVariable pusty ciąg lub opcjonalnie

Działa to świetnie w większości naszych środowisk, w których przypisujemy wartości do wszystkich zmiennych, ale kiedy publikujemy do naszej bazy danych na żywo, chciałbym móc uczynić DomainPrefix pustym ciągiem.

Kiedy próbuję zmienić Live.profile.xml ustawić DomainPrefix do żadnej wartości pojawia się błąd: „Wystąpił błąd podczas generowania planu wdrożenia Wdrożenie nie może kontynuować brakujących wartości dla następujących zmiennych Sqlcmd:.. DomainPrefix. "

To co chciałbym Live.profile.xml wyglądał:

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

Czy ktoś wie jak ustawić SqlCmdVariable do pustej wartości lub sprawiają, że zmienna opcja?

Zastosowanie:

  • VS 2013 sqlproj
  • SqlPackage.exe uruchomić publikowania do DB z linii poleceń
+0

W jaki sposób używasz DomainPrefix? Czy jest to część skryptów Pre/Post używanych w obiektach/kodzie, nazwach serwerów, czymś innym?Jeśli używasz tego tylko dla skryptów przed/po, możesz odpowiednio zmodyfikować te skrypty za pomocą sekcji dla Produkcji, która jest nieco inna. –

+0

DomenaPrefix jest specyficznie używana w skrypcie pocztowym i mamy trochę kodu do obsługi - ale jest to również jedna z wielu zmiennych, które chcemy ustawić jako pusty ciąg, więc dobrze byłoby wiedzieć, czy istnieje sposób na zrobienie to puste/opcjonalne. – Saan

+0

Nie jestem świadomy, jak to zrobić, dlatego chciałem upewnić się, że używasz go tylko w skrypcie Post. Możesz sprawdzić pewną wartość (np. "Prod") i uczynić ją pustą, jeśli tak jest i/lub utworzyć sekcję dla Produkcji. Myślę, że tworzenie MS nigdy nie uważa pustej zmiennej, ponieważ może to spowodować spustoszenie, jeśli zostanie użyte w kodzie, szczególnie w przypadku nazw DB. –

Odpowiedz

2

Nie wydaje się być jakiś sposób przechodzenia przez NullOrWhiteSpace ciąg jako SqlCmdVariable. Podstawowa składnia SqlCmdVariable jest:

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

Albo Value lub DefaultValue musi mieć jakąś wartość niż biała przestrzeń.

Tak więc, dla twojej pierwszej opcji, jak @Peter zasugerował w komentarzu do pytania, możesz obsłużyć to w twoim Posteployment SQL skrypcie przez testowanie dla określonej wartości, takiej jak <Live> czy cokolwiek innego. Zrobić coś jak następuje:

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

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

A potem po prostu złączyć @DomainPrefix do strun zamiast tym $(DomainPrefix) w nich.

Oczywiście, jeśli potrzebujesz, aby zmienna SQLCMD była dostępna w głównym kontekście T-SQL, a nie tylko jako zmienna T-SQL (na przykład, jeśli używasz tego jako prefiksu serwera połączonego lub bazy danych wzdłuż linie UPDATE $(DomainPrefix)[DatabaseName].[dbo].[TableName]... gdzie $(DomainPrefix) definiuje się zwykle jako [LinkedServerName].), to powinieneś być w stanie uciec z użyciem Value z /**/ (lub nawet /* Live */) tak, że otrzymany T-SQL będzie interpretowane jako:

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

lub:

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

oba z nich są poprawnym T-SQL i działają. Tak więc w tym przypadku można użyć następującego:

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

Sprytnie i widzę, jak to może obejść twój problem. To jeden z powodów, dla których próbowałem dowiedzieć się, gdzie używasz zmiennej i w jakim celu. :) –

+0

@PeterSchott Dzięki :-). Jednak nie jestem O.P. ;-) –

Powiązane problemy