Портирование экспорта "SQL" в T-SQL - PullRequest
4 голосов
/ 02 апреля 2012

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Всякий раз, когда мне приходилось передавать данные между двумя базами данных, я обнаруживал, что самый быстрый способ выглядит следующим образом:

  1. Используйте функцию выгрузки или эквивалентную функцию для массового экспорта исходной базы данных в текстfile.
  2. Напишите программное обеспечение, которое преобразует формат текстового файла из исходного формата в формат назначения.
  3. Используйте функцию массового импорта или аналогичную функцию для загрузки текстового файла в базу данных назначения.
1 голос
/ 02 апреля 2012

Если у вас есть прямой доступ к исходной базе данных, ваша самая безопасная ставка на самом деле может заключаться в том, чтобы запросить ее, и для каждой найденной записи вставьте ее в новую базу данных. Если вы случайно испортили свои данные перед тем, как вставить их каким-то небольшим образом, вы можете не заметить, пока у вас не возникнет большая проблема. Если вы используете (потенциально более медленный) метод вставки для каждой строки, вы, по крайней мере, обладаете безопасностью, которая, вероятно, не приведет к тому, что ваши данные не будут помещаться с неуместным символом в регулярном выражении. Просто мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...