计算bcp导入中右截断行的数量

时间:2013-09-19 11:20:41

标签: bash bcp

我正在尝试数不行。执行bcp导入时发生的截断错误我尝试了一个简单的逻辑,我在其中重定向bcp的输出,然后在该文件中重定向grep right truncation。以下是代码段:

bcp Test..Table in datafile.txt -f format_file -m 0 -S server -T > error_file.txt
error_count=`cat error_file.txt | grep -c ".*right truncation.*" `

问题是grep在有很多行时需要花费太多时间,而且即使没有正确的截断错误也需要更多时间。有更好的方法吗? 我在bcp下的窗口中使用cygwin实用程序并将其导入MS SQL server 2008

2 个答案:

答案 0 :(得分:1)

你要到达的最大加速是把所有东西都装在一起。即,而不是你的命令,你会有:

error_count=$(bcp Test..Table in datafile.txt-f format_file -m 0 -S server -T | fgrep -c "right truncation")

(以上内容包括已从您的正则表达式中删除“。*”的建议更改,并使用fgrep。)

这样可以避免将某些内容写入磁盘然后再次阅读,以搜索right truncation

最后一点:我认为您帖子中包含的命令缺少空格(datafile.txt-f)?

答案 1 :(得分:0)

我在bcp上进行了研究,发现-e开关可以直接在错误日志文件中写入任何错误,并直接从该日志中对其进行加密,从而显着提升性能。

以下是命令中bcp的输出:

Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
1000 rows sent to SQL Server. Total sent: 2000
1000 rows sent to SQL Server. Total sent: 3000
1000 rows sent to SQL Server. Total sent: 4000
1000 rows sent to SQL Server. Total sent: 5000
1000 rows sent to SQL Server. Total sent: 6000
1000 rows sent to SQL Server. Total sent: 7000
1000 rows sent to SQL Server. Total sent: 8000
1000 rows sent to SQL Server. Total sent: 9000
1000 rows sent to SQL Server. Total sent: 10000
1000 rows sent to SQL Server. Total sent: 11000
1000 rows sent to SQL Server. Total sent: 12000
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation

12406 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 1351   Average : (9182.8 rows per sec.)

[INFO BCP IN: data2.txt] Import failed for 1 rows out of 12407 rows, Total 0.0%.

Fri Sep 20 01:24:39 CDT 2013

[INFO BCP IN: data2.txt] Total time elapsed 0 days 0 hour 0 minutes 2 seconds

以下是错误日志输出:

#@ Row 12407, Column 1: String data, right truncation @#
The Bulk Copy Program (BCP) is a command-line utility

因此,将代码修改为grep错误日志文件而不是bcp的整个输出,我们可以获得非常好的性能提升:

bcp Test..Table in datafile.txt -f format_file -m 0 -S server -T -e error_file.txt
error_count=`fgrep -c "right truncation" error_file.txt `

fedorqui,TrueY和pgl感谢您的建议。