2012-07-05 1 views
7

既存のSQL Server 2008 r2 .dbprojをSQL Server 2012 .sqlproj(SQL Serverデータツールを使用)にアップグレードしました。sqlproj(SQL Server 2012)スクリプトのmsbuildプロパティの使用方法

は以前、私は私のプロジェクトにSQLCMD変数を定義することができたし、次の要素を追加することによって、MSBuildの値を使用するプロジェクトファイルを編集して値を定義します。

私はその後、使用することができ
<ItemGroup> 
    <SqlCommandVariableOverride Include="ProjectDirectory=$(MSBuildProjectDirectory)" /> 
</ItemGroup> 

このような私の配備後スクリプトで:

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

ただし、アップグレード後に、これはもはや機能していないようにみえます。

同じエントリを新しいsqlprojに追加しようとしましたが、パブリッシュ機能はそれを受け取っておらず、値を提供したいと考えています。私が$(MSBuildProjectDirectory)を提供すると、それは文字通り解釈され、失敗します。

新しい領域では、ローカルファイルパスを指定するメカニズムやmsbuildの値を使用するメカニズムは何ですか?

答えて

2

2012年sqlproj(SSDTデータベースプロジェクト)では、公開プロファイルを使用します。まず、データベースプロジェクトを右クリックし、「公開」を選択してください。

これで、必要なオプションを設定して、プロジェクトのいわゆる公開プロファイルに保存することができます。このプロファイルをダブルクリックすると、適切なオプションが設定された公開ウィザードが起動します。で

あなたのあなたはsqlcmdの変数のためにハードコードされた値を含めることができますプロフィール公開:必要に応じて、ビルド時に動的な値でこれらを更新することができ

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

。あなたの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> 

これは、XMLを更新するための拡張機能が必要です。私はmsbuild拡張パックを使用します。

このメカニズムのクレジットはJamie Thomson

です
関連する問題