Как мне массово вставлять данные в SQL Server без использования bcp?

#sql-server #sql-server-2005 #bulkinsert

#sql-server #sql-server-2005 #bulkinsert

Вопрос:

У меня есть база данных SQL Server 2005 с несколькими таблицами вида

 Table (id <Primary Key, Identity column>, name <VarChar (255)>)
  

У меня есть Java-сервлет, который должен иметь возможность массово добавлять информацию в эти таблицы. База данных SQL Server запущена на компьютере, отличном от сервлета, и у меня нет доступа к файловой системе этого компьютера.

Насколько я понимаю, я не могу использовать массовую вставку, потому что для этого требуется, чтобы файл данных находился в файловой системе сервера (чего я не могу сделать), для этого требуется, чтобы вы заполнили все поля (не могу сделать, одно поле является полем идентификации, которое заполняется базой данных) или чтобы незаполненное поле было последним (я ставлю поле идентификации первым и не имею желания это менять), и чтобы файл формата находился в файловой системе сервера.

В MySQL я бы просто использовал Load Data Local InFile . В SQL Server 2005, похоже, отсутствует такая возможность. Я просто что-то упускаю? Есть ли у меня какой-либо способ добавить более одной записи одновременно в таблицу SQL Server без использования bcp или массовой вставки?

TIA,

Грег

Комментарии:

1. файл данных — «Это полный путь к файлу данных, который содержит данные для импорта в указанную таблицу или представление. МАССОВАЯ ВСТАВКА может импортировать данные с диска (включая сеть, гибкий диск, жесткий диск и так Далее).»

Ответ №1:

 INSERT INTO Table (column_name, ...)
Values
(column_values,...),(column_values,...),(column_values, ...), ...
  

Обратите внимание, что это возможно с SQL Server 2008

http://msdn.microsoft.com/en-us/library/ms174335(v=SQL.100).aspx

Для SQL Server 2005 и ниже вам нужно будет сделать что-то вроде этого

 INSERT INTO table (column_name, column_name, ...)
SELECT column_value , column_value, ...
UNION ALL
SELECT column_value , column_value, ...
UNION ALL
SELECT column_value , column_value, ...
UNION ALL
SELECT column_value , column_value, ...
UNION ALL
SELECT column_value , column_value, ...
  

Комментарии:

1. Спасибо, это работает. Я собираюсь отправить это на SQL Server через JDBC. Знаете ли вы, что максимальная длина команды, которую вы можете отправить в SQL Server 2005 с помощью JDBC 4?

2. Нет, я этого не делаю.. но, учитывая ваши потребности, вы могли бы просто выполнять пакетную обработку, скажем, через каждые 50 или 100 строк в вашем текстовом файле. Итак, каждые 50-100 строк в вашем текстовом файле запускайте инструкцию insert. Я бы попытался сначала посмотреть, сколько будет занимать команда JDBC

Ответ №2:

Итак, у вас нет доступа ни к файловой системе на компьютере с сервлетами, ни к SQL Server? (Я не уверен, как вы могли бы сделать это и в MySQL, поскольку для ЗАГРУЗКИ ДАННЫХ в ЛОКАЛЬНЫЙ файл требуется файл).

ADO.NET поддерживает SqlBulkCopy API: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

Комментарии:

1. Нет, у меня есть доступ к файловой системе сервлета, у меня просто нет доступа к файловой системе сервера SQL Server. И мой сервлет работает в Linux, а не в Windows.

2. @Greg Dougherty Вы могли бы попробовать BULK INSERT FROM на SQL Server, чтобы указать на учетную запись службы общего доступа к сети, потребовались бы разрешения, общий ресурс должен был бы существовать и т.д. В качестве альтернативы, вставить через SP, используя большой XML?