2012-07-05 6 views
7

Acabo de actualizar mi SQL Server 2008 r2 .dbproj a SQL Server 2012 .sqlproj (utilizando SQL Server Data Tools).cómo usar las propiedades de msbuild en la secuencia de comandos sqlproj (SQL Server 2012)

Anteriormente, yo era capaz de definir una variable SQLCMD en mi proyecto, y luego definir el valor editando el archivo de proyecto para utilizar los valores msbuild añadiendo el siguiente elemento:

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

que luego podría utilizar en mi script PostDeployment como este:

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

Sin embargo, después de la actualización, esto ya no parece funcionar.

He intentado agregar esa misma entrada al nuevo sqlproj, pero la funcionalidad de publicación no parece recogerlo y quiere que proporcione un valor. Si proporciono $(MSBuildProjectDirectory), eso se interpreta literalmente y falla.

Bajo el nuevo régimen, ¿cuál es el mecanismo para especificar una ruta de archivo local y/o usar valores de msbuild?

Respuesta

2

En un servidor sql 2012 sqlproj (proyecto de base de datos SSDT) ​​utiliza los perfiles de publicación. Puede comenzar haciendo clic con el botón derecho en su proyecto de base de datos y seleccionando 'Publicar'.

Puede configurar las opciones deseadas y guardarlas en el llamado perfil de publicación en su proyecto. Al hacer doble clic en este perfil se inicia el asistente de publicación con las opciones correctas establecidas.

En su perfil de publicación puede incluir valores no modificables para las variables de sqlcmd:

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

Si lo desea, puede actualizar estos con los valores dinámicos durante la compilación. En su proyecto 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> 

Esto requiere una extensión para actualizar el XML. Yo uso el paquete de extensión msbuild.

Créditos de este mecanismo vaya a Jamie Thomson

Cuestiones relacionadas