我正在尝试数不行。执行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
。
答案 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感谢您的建议。