2012-07-05 11 views
7

Ho appena aggiornato il mio .dbproj di SQL Server 2008 r2 esistente a un SQL Server 2012 .sqlproj (utilizzando SQL Server Data Tools).come utilizzare le proprietà di msbuild nello script sqlproj (SQL Server 2012)

In precedenza, sono stato in grado di definire una variabile SQLCMD nel mio progetto, e quindi definire il valore modificando il file di progetto per utilizzare i valori MSBuild aggiungendo il seguente elemento:

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

quale ho potuto quindi utilizzare nel mio script PostDeployment come questo:

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

Tuttavia, dopo l'aggiornamento, questo sembra non funzionare più.

Ho provato ad aggiungere la stessa voce al nuovo sqlproj, ma la funzionalità Pubblica non sembra prenderlo e mi chiede di fornire un valore. Se fornisco $(MSBuildProjectDirectory), questo viene interpretato letteralmente e fallisce.

In base al nuovo regime, qual è il meccanismo per specificare un percorso file locale e/o utilizzare i valori di msbuild?

risposta

2

In un server sql 2012 sqlproj (progetto di database SSDT) ​​si utilizzano i profili di pubblicazione. È possibile iniziare facendo clic con il pulsante destro del mouse sul progetto del database e scegliendo "Pubblica".

È quindi possibile impostare le opzioni desiderate e salvarle in un cosiddetto profilo di pubblicazione nel progetto. Facendo doppio clic su questo profilo si avvia la procedura guidata di pubblicazione con le opzioni corrette impostate.

Nel vostro profilo di pubblicazione è possibile includere valori hard-coded per le variabili sqlcmd:

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

Se lo si desidera, è possibile aggiornare questi con valori dinamici durante la compilazione. Nel progetto msbuild:

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

Ciò richiede un'estensione per aggiornare l'XML. Io uso il pacchetto di estensione msbuild.

I crediti per questo meccanismo vanno a Jamie Thomson

Problemi correlati