从msbuild脚本运行bcp时如何使构建失败?

时间:2011-05-18 22:00:56

标签: sql-server-2005 msbuild bcp

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

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

我尝试(下面的每个构建脚本片段)指定一个错误文件,并检查它是否存在,遗憾的是这意味着即使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失败?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用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." />

答案 2 :(得分:0)

好的,所以它并不完全使用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中定义)