作为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"`" -r"`\n" $(bcpConnectionString)" />
<Exec Command="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t"`" -r"`\n" $(bcpConnectionString)" />
<Error Condition="Exists('BcpErrors.txt')" Text="One or more bcp commands contained errors." />
如果bcp无法加载任何数据,有没有办法让msbuild失败?
答案 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中定义)