MS SQL Server - массовая вставка через сеть - PullRequest
4 голосов
/ 13 января 2009

У меня есть приложение, которое использует MS SQL Server, для которого мне нужно будет выполнить массовую вставку из файла. Камнем преткновения является то, что база данных и мое приложение будут размещаться на отдельных серверах. Каков наилучший способ сделать массовую вставку по сети? До сих пор я придумал две идеи:

  1. На сервере приложений предоставьте общий доступ к каталогу, который может найти сервер БД, и выполните импорт, используя оператор массовой вставки из удаленного файла

  2. Запустите FTP-сервер с сервера БД - когда импорт будет выполнен, просто загрузите файл ftp на сервер БД и выполните импорт, используя массовую вставку из локального файла (я склоняюсь к этой опции).

Может кто-нибудь еще сказать мне, есть ли лучший способ сделать это, или если нет, какой из них имеет больше смысла, и почему?

Ответы [ 5 ]

2 голосов
/ 13 января 2009

Я делал это раньше и пробовал оба варианта.

В конце я сделал противоположный выбор 1. Предоставить общий доступ к каталогу на сервере БД, который приложение может найти. Вам не нужно иметь дело с проблемами пропускной способности во время массовой вставки.

Опция FTP-сервера работает, если вы особенно обеспокоены безопасностью или переносимостью.

Последний вариант (будьте очень осторожны) - использовать DTS с локализованным SQL-сервером. Это может быть более безопасно. Если вы сделаете это неправильно, это будет гораздо менее эффективно.

1 голос
/ 21 октября 2011

Я все еще ищу способ сделать это в MS SQL, но то, что я сделал в MySQL, это чтобы сохранить CSV как BLOB во временной таблице, запустить SELECT ... INTO DUMPFILE в каталоге, локальном для Сервер БД, затем выполните обычную инструкцию LOAD DATA для этого локального файла (РЕДАКТИРОВАТЬ: я чувствую, что должен указать, это было до того, как LOAD DATA LOCAL была доступна).

Я думаю, spWriteStringToFile сделает это.

РЕДАКТИРОВАТЬ: я на что-то.

comm.CommandText = @"EXEC spWriteStringToFile @data, 'c:\datadumps', 'data.csv';
    BULK INSERT my_table FROM 'c:\datadumps\data.csv';";
comm.Parameters.AddWithValue("data", File.ReadAllText(path));
comm.ExecuteNonQuery();
0 голосов
/ 30 марта 2012

На самом деле вы можете разместить файл на сервере приложений и базы данных.

Оба файла должны иметь одинаковый путь. С сервера приложений цель только для выбора. Сервер базы данных предназначен для массовой вставки.

Это то, что я сделал для своего клиента, и они также согласились с этим простым трюком.

0 голосов
/ 13 января 2009

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

Я не согласен с cmartin по поводу добавления открытой папки на сервер БД. Обычно вы не хотите открывать общий доступ к файлам на сервере БД, поскольку это обычно считается угрозой безопасности, и многие места этого не допустят. Это сказало бы на том, что вы переместили бы файл в другое место, чтобы использовать массовый импорт.

0 голосов
/ 13 января 2009

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

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