У меня есть стороннее приложение, которое выполняет экспорт базы данных в «формат 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?
Когда я запускаю его, он застревает в запросе Execute.Размер файла SQL составляет 8000 КБ (но я могу его настроить). Могу ли я что-нибудь сделать, чтобы ускорить его?Возможно, сделайте еще какое-нибудь форматирование и включите его в массивную вставку?