Как передать переменные, такие как массивы / datatable для SQL-сервера? - PullRequest
4 голосов
/ 30 октября 2008

Иногда вам нужно обновить базу данных множеством строк, которые у вас есть в таблице данных, или у вас есть массив, полный данных, вместо того, чтобы собрать все эти данные вместе в строку и затем разбить в SQL SERVER, или вместо итерации Dataatable в коде строка за строкой и обновление базы данных, есть ли другой способ? Существуют ли другие типы переменных помимо традиционных в SQL SERVER 2005?

Ответы [ 3 ]

6 голосов
/ 30 октября 2008

Я согласен с Джоном в том, что SqlBulkCopy или sqlxml - лучшие варианты в SQL Server 2005; обратите внимание, что в SQL Server 2008 у вас также есть табличные параметры , которые стоит рассмотреть; особенно при смешивании с новым объединением объединения .

Обратите внимание, что если вы используете SqlBulkCopy, я настоятельно рекомендую массовую вставку только в промежуточную таблицу, т. Е. В отдельную таблицу только для импорта; затем запустите хранимую процедуру, чтобы переместить данные в оперативную таблицу. Таким образом, вы получаете правильное ведение журнала и можете выполнять транзакции с узкой областью действия только в базе данных, пока вы запускаете SP (то есть вам не нужна транзакция, охватывающая весь этот сетевой IO).

Еще одна точка; если вы имеете дело с большими объемами данных, вам может не потребоваться загружать DataTable (так как это заставляет вас сначала буферизовать все данные в памяти); в качестве альтернативы можно также написать свой собственный IDataReader, который извлекает данные из потока (например, из файла и т. д.); см SimpleDataReader здесь . SqlBulkCopy с радостью примет данные от IDataReader.

4 голосов
/ 30 октября 2008

Есть несколько способов сделать это.

Если вы просто вставляете строки, я бы создал объект DataTable с информацией в нем, а затем использовал бы объект SqlBulkCopy:

SqlBulkCopy copier = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.Default);
copier.BatchSize = 500; //# of rows to insert at a time
copier.DestinationTableName = "dbo.MyTable";
copier.WriteToServer(myDataTable);

Другой вариант - обернуть ваши данные в xml (как вы этого хотите) и отправить их в свою хранимую процедуру (которая делает все, что вам нужно), используя тип данных sql 2005 'xml'

2 голосов
/ 30 октября 2008

Джон упомянул использование XML ... и этот подход я бы использовал в вашей ситуации (SQL Server 2005 и создание sproc, который обрабатывает SQL для вас).

Вот пример того, как начать работу (это просто оператор select, но вы можете сделать его обновлением, если хотите):

CREATE PROCEDURE MySproc ( @Accounts XML )
AS

SELECT
    Accounts.AccountID.query('.')
FROM
    @Accounts.nodes('//ID/text()') AS Accounts(AccountID)

GO
EXEC MySproc '<Accounts><ID>123</ID><ID>456</ID></Accounts>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...