我有一个第三方应用程序,可以将数据库导出为“ SQL格式”,这是相当棘手的,但是它似乎并没有完全使用T-SQL。当我导出它时,会产生这样的内容
INSERT INTO [ExampleDB] ( [IntField] , [DateTimeField] , [VarcharField], [BinaryField]) VALUES (1 , '2012/04/02 12:25:00:01' , 'Some Text' , X'123456'), (2 , '0000/00/00 00:00:00:00' , 'B' , NULL), --(SNIP, it does this for 1000 records) (999,'0000/00/00 00:00:00:00' , 'Other Text' , null); (1000 ,'0000/00/00 00:00:00:00' , 'D' , null); INSERT INTO [ExampleDB] ( [IntField] , [DateTimeField] , [VarcharField] , BinaryField) VALUES (1001 , '2012/04/02 12:25:00:01' , 'Trying to break my parser with the next line', null), (1002 , '0000/00/00 00:00:00:00' , ' ''X''123' , X'deadbeef'), (1003 , '0000/00/00 00:00:00:00' , 'Did it break it?' , null), (1004 , '2012/04/02 12:25:00:01' , 'What about this? ''0000/00/00 00:00:00:00'' Will that?' , null), --(SNIP)
我遇到的两个障碍是:
'0000/00/00 00:00:00:00'
我认为我可以对此进行Regex.Replace处理,但是我想知道是否有更简单的解决方案。到目前为止,我要导入的代码是
Regex.Replace
using (var cmd = new SqlCommand("", conn)) { //snip cmd.CommandTimeout = 0; //Wait forever, bad bad bad, but what else can I do? using (var txtRdr = new StreamReader(file)) { string query = txtRdr.ReadToEnd(); query = query.Replace(" '0000/00/00 00:00:00:00' ", " NULL "); query = Regex.Replace(query, "X'([0-9a-fA-F]+)'", @"0x$1"); cmd.CommandText = query; cmd.ExecuteNonQuery(); } }
因为它们列出值的方式我知道我与SQL2008或更高版本绑定在一起,但是我编写的使SQL2008可解析的代码是否有任何疑问?
当我运行它时,它在执行查询中陷入了困境。SQL文件的大小为8000 KB(但我可以调整),我可以做些什么来加快速度吗?也许还要进行更多格式化,然后将其放入批量插入中?
每当我不得不在两个数据库之间传输数据时,我发现最快的方法似乎如下: