将“SQL”导出移植到T-SQL

我有一个第三方应用程序,它将数据库导出为“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'的值为日期
  • 事实上,他们将二进制输出存储为前缀为X的字符串

我想我可以只做一个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(但我可以调整它)有什么办法可以加快速度吗? 也许做一些更多的格式化并将其转换为批量插入?

每当我不得不在两个数据库之间传输数据时,我发现最快的方式似乎如下:

  1. 使用卸载或等效function将源数据库批量导出到文本文件。
  2. 编写将文本文件格式从源格式转换为目标格式的软件。
  3. 使用批量导入或类似function将文本文件加载到目标数据库中。

如果您可以直接访问源数据库,那么您最安全的选择可能是查询它,并且您找到的每条记录都会插入到新数据库中。 如果您在以小的方式插入数据之前意外搞砸了数据,在您手上有大问题之前可能不会注意到。 如果你为每一行执行插入(可能更慢)的方法,你至少要有一个安全性,你可能不会用正则表达式中放错位置的字符来填充你的数据。 只是一个想法。