【问题标题】:How to get build to fail when running bcp from an msbuild script?从 msbuild 脚本运行 bcp 时如何使构建失败?
【发布时间】:2011-05-18 22:00:55
【问题描述】:

作为 sql server 2005 的一部分,有大容量复制命令“bcp.exe”(http://msdn.microsoft.com/en-us/library/ms162802%28SQL.90%29.aspx)

我们正在使用 exec 任务从我们的 msbuild 脚本运行 bcp 命令。不幸的是,当 bcp 无法加载一行数据时,构建仍然成功。

我尝试(根据下面的构建脚本 sn-p)指定一个错误文件,并检查它是否存在,不幸的是,这意味着即使 bcp 完全成功,构建也总是失败,因为看起来 bcp 总是会创建错误文件如果没有错误。

<ItemGroup>
  <bcpFiles Include="$(DataPath)\*.txt" />
</ItemGroup>
<Delete Files="BcpErrors.txt" />
<Message Text="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t&quot;`&quot; -r&quot;`\n&quot; $(bcpConnectionString)" />
<Exec Command="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t&quot;`&quot; -r&quot;`\n&quot; $(bcpConnectionString)" />
<Error Condition="Exists('BcpErrors.txt')" Text="One or more bcp commands contained errors." />

如果 bcp 无法加载任何数据,我有什么方法可以让 msbuild 无法构建?

【问题讨论】:

  • BCP 失败时是否产生任何确定性输出?
  • 它会在控制台上生成错误文本,以及在控制台上复制的行数信息,但仅此而已。

标签: sql-server-2005 msbuild bcp


【解决方案1】:

如果 BCP 返回非零错误代码表示失败,则 MSBuild Exec 任务应检测到该错误并将任务标记为失败。

【讨论】:

  • 显然 BCP 没有返回非零代码,除非您可以看到我在问题中的 msbuild 代码上做错了什么。
  • 我看不出该代码有什么问题。就个人而言,我不会在暂存步骤上使构建失败。
  • 我确实需要构建失败。有了这些数据,如果没有复制进去,那么环境将无法正常工作。我不想把糟糕的环境交给测试团队。
  • @Nathan - 我不了解您的环境,但我希望 QA 有自己的流程来准备环境以适应他们的测试用例。抱歉,我无法提供更多帮助
【解决方案2】:

您可以使用MSBuild ExtensionPack“文件”任务在输出文件中查找错误文本:

    <MSBuild.ExtensionPack.FileSystem.File TaskAction="FilterByContent" RegexPattern="Error = " Files="BcpErrors.txt">
        <Output TaskParameter="IncludedFileCount" PropertyName="ErrorFileCount"/>
    </MSBuild.ExtensionPack.FileSystem.File>        
    <Error Condition="$(ErrorFileCount) != 0" Text="One or more bcp commands contained errors." />

【讨论】:

  • 不幸的是,错误文件大部分时间似乎也是空的。
  • 哦...那么您是否收到了对控制台的错误响应,而不是对“BcpErrors.txt”的错误响应?
  • 是的,我在控制台上得到了错误,但在错误文件中没有。
  • 这可能有点晚了,因为您现在有了解决方案,但是您可以尝试使用 ">" 字符将输出发送到 Exec 命令中的文件,例如&lt;Exec Command="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t&amp;quot;" -r"\n&amp;quot; $(bcpConnectionString) &gt; CmdErrors.txt" /&gt;
【解决方案3】:

好的,所以它不完全使用 bcp.exe,但 BULK INSERT 与 bcp.exe 非常相似,可以采用相同的文件格式,并且具有大多数相同的选项。如果 BulkInsert 查询失败,Sql.Execute 任务也会失败。所以我最终得到了

<ItemGroup>
  <bcpFiles Include="$(DataPath)\*.txt" />
</ItemGroup>
<Sql.Execute ConnectionString="$(ConnectionString)" Sql="BULK INSERT [$(DatabaseName)].dbo.[%(bcpFiles.FileName)] FROM '%(bcpFiles.FullPath)' WITH (DATAFILETYPE='char', KEEPIDENTITY, FIELDTERMINATOR='`', ROWTERMINATOR='`\n', MAXERRORS=1)" />

(Sql.Execute 任务在 Microsoft.Sdc.Common.tasks 中定义)

【讨论】:

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