如何在sqlproj(SQL Server 2012)脚本中使用msbuild属性

Ken*_*ill 7 sql-server-2012 visual-studio-2012 sql-server-data-tools

我刚刚将现有的SQL Server 2008 r2 .dbproj升级到SQL Server 2012 .sqlproj(使用SQL Server数据工具).

以前,我能够在我的项目中定义一个SQLCMD变量,然后通过编辑项目文件来定义值,以通过添加以下元素来使用msbuild值:

<ItemGroup>
    <SqlCommandVariableOverride Include="ProjectDirectory=$(MSBuildProjectDirectory)" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

然后,我可以在我的PostDeployment脚本中使用,如下所示:

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

但是,升级后,这似乎不再起作用.

我已经尝试将相同的条目添加到新的sqlproj,但发布功能似乎没有提取它并希望我提供一个值.如果我提供$(MSBuildProjectDirectory),那就是按字面解释并失败.

在新制度下,指定本地文件路径和/或使用msbuild值的机制是什么?

小智 3

在 sql server 2012 sqlproj(SSDT 数据库项目)中,您使用发布配置文件。您可以通过右键单击数据库项目并选择“发布”开始。

然后,您可以设置所需的选项并将其保存在项目中所谓的发布配置文件中。双击此配置文件将启动带有正确选项集的发布向导。

在您的发布配置文件中,您可以包含 sqlcmd 变量的硬编码值:

<ItemGroup>
    <SqlCmdVariable Include="ProjectDirectory">
        <Value>UNKNOWN</Value>
    </SqlCmdVariable>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以在构建期间使用动态值更新它们。在您的 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>
Run Code Online (Sandbox Code Playgroud)

这需要扩展来更新 XML。我使用 msbuild 扩展包。

该机制归功于杰米·汤姆森 (Jamie Thomson)