【问题标题】:how to use msbuild properties in sqlproj (SQL Server 2012) script如何在 sqlproj (SQL Server 2012) 脚本中使用 msbuild 属性
【发布时间】:2012-07-05 14:56:34
【问题描述】:

我刚刚将现有的 SQL Server 2008 r2 .dbproj 升级到 SQL Server 2012 .sqlproj(使用 SQL Server Data Tools)。

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

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

然后我可以像这样在我的 PostDeployment 脚本中使用它:

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 值的机制是什么?

【问题讨论】:

    标签: visual-studio-2012 sql-server-2012 sql-server-data-tools


    【解决方案1】:

    在 sql server 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多