2012-07-05 6 views
7

Ich habe gerade meinen vorhandenen SQL Server 2008 R2.dbproj auf einen SQL Server 2012.sqlproj (mithilfe von SQL Server-Datentools) aktualisiert.Verwenden von Msbuild-Eigenschaften in sqlproj (SQL Server 2012) -Skript

Früher konnte ich eine SQLCMD Variable in meinem Projekt definieren und dann den Wert definieren, indem Sie die Projektdatei Bearbeitung von msbuild Werte zu verwenden, das folgende Element hinzu:

<ItemGroup> 
    <SqlCommandVariableOverride Include="ProjectDirectory=$(MSBuildProjectDirectory)" /> 
</ItemGroup> 

Was ich könnte dann verwenden in meinem PostDeployment-Skript wie folgt:

SELECT * INTO dbo.MyTable FROM dbo.MyTable WHERE 1=2 
BULK INSERT dbo.MyTable 
FROM '$(ProjectDirectory)\data\dbo.MyTable.dat' 
WITH (DATAFILETYPE = 'widenative') 

Allerdings scheint dies nach dem Upgrade nicht mehr zu funktionieren.

Ich habe versucht, den gleichen Eintrag zu den neuen sqlproj hinzuzufügen, aber die Publish-Funktion scheint es nicht aufzuheben und möchte, dass ich einen Wert angeben. Wenn ich $(MSBuildProjectDirectory) liefern, wird das wörtlich interpretiert und schlägt fehl.

Unter dem neuen Regime, was ist der Mechanismus zum Angeben eines lokalen Dateipfads und/oder Verwenden von Msbuild-Werten?

Antwort

2

In einem SQL-Server 2012 sqlproj (SSDT-Datenbankprojekt) verwenden Sie Veröffentlichungsprofile. Sie können beginnen, indem Sie mit der rechten Maustaste auf Ihr Datenbankprojekt klicken und "Veröffentlichen" auswählen.

Sie können dann gewünschte Optionen festlegen und diese in einem so genannten Publishing-Profil in Ihrem Projekt speichern. Wenn Sie auf dieses Profil doppelklicken, wird der Veröffentlichungsassistent mit den richtigen Optionen gestartet.

In Ihrem Publizierungsprofil Sie hartcodierte Werte für sqlcmd Variablen können sein:

<ItemGroup> 
    <SqlCmdVariable Include="ProjectDirectory"> 
     <Value>UNKNOWN</Value> 
    </SqlCmdVariable> 
</ItemGroup> 

Falls gewünscht, können Sie diese mit dynamischen Werten während Build aktualisieren können. In Ihrem Msbuild-Projekt:

<Target Name="SetProjectDirectoryInPublishXml"> 
    <ItemGroup> 
     <Namespaces Include="nsMsbuild"> 
      <Prefix>nsMsbuild</Prefix> 
      <Uri>http://schemas.microsoft.com/developer/msbuild/2003</Uri> 
     </Namespaces> 
    </ItemGroup> 
    <ItemGroup> 
     <SSDTPublishFiles Include="$(SolutionBinFolder)\**\*.publish.xml" /> 
    </ItemGroup> 
    <MSBuild.ExtensionPack.Xml.XmlFile Condition="%(SSDTPublishFiles.Identity) != ''" 
            TaskAction="UpdateElement" 
            File="%(SSDTPublishFiles.Identity)" 
            Namespaces="@(Namespaces)" 
            XPath="//nsMsbuild:SqlCmdVariable[@Include='ProjectDirectory']/nsMsbuild:Value" 
            InnerText="$(MSBuildProjectDirectory)"/> 
</Target> 

Dies erfordert eine Erweiterung, um das XML zu aktualisieren. Ich benutze das Msbuild Erweiterungspaket.

Credits für diesen Mechanismus gehen zu Jamie Thomson