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

У меня есть БД 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 или массовой вставки?

ТИА,

Грег


person Greg Dougherty    schedule 06.04.2011    source источник


Ответы (2)


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

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

http://msdn.microsoft.com/en-us/library/ms174335%28v=SQL.100%29.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, ...
person John Hartsock    schedule 06.04.2011
comment
Спасибо, это работает. Я собираюсь отправить это на SQL Server через JDBC. Знаете ли вы, что максимальная длина команды, которую вы можете отправить в SQL Server 2005 с помощью JDBC 4? - person Greg Dougherty; 07.04.2011
comment
Нет, я не знаю.. но, учитывая ваши потребности, вы можете просто выполнить пакетную обработку, скажем, каждые 50 или 100 строк в текстовом файле. Итак, каждые 50-100 строк в вашем текстовом файле запускайте оператор вставки. Я бы попытался посмотреть, сколько команда JDBC продержится в первую очередь. - person John Hartsock; 07.04.2011

Значит, у вас нет доступа ни к файловой системе на машине с сервлетами, ни к SQL Server? (Я не уверен, как вы это сделаете и в MySQL, так как LOAD DATA LOCAL INFILE нуждается в файле).

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

person Cade Roux    schedule 06.04.2011
comment
Нет, у меня есть доступ к файловой системе сервлета, у меня просто нет доступа к файловой системе сервера SQL Server. И мой сервлет работает в Linux, а не в Windows. - person Greg Dougherty; 07.04.2011
comment
@Greg Dougherty Вы можете попробовать BULK INSERT FROM на SQL Server, указывающем на учетную запись службы общего доступа к сети, для которой потребуются разрешения, общий ресурс должен существовать и т. д. Или вставить через SP, используя большой XML? - person Cade Roux; 07.04.2011