Каков наилучший способ передачи большого количества параметров в SQL Server - PullRequest
7 голосов
/ 08 мая 2009

Я пытаюсь определить, какой лучший способ передать большое количество параметров в хранимую процедуру.

Вот некоторые методы, о которых я думал;

  1. Создайте соответствующие объекты базы данных, включая объект параметра для каждого элемента, и вызовите объект команды

  2. Передайте XML-документ и распакуйте его с помощью хранимой процедуры. (Приложение будет уже их в формате XML)

Если у кого-нибудь есть идеи получше, я открыт, чтобы выслушать их

Спасибо.

Ответы [ 5 ]

4 голосов
/ 08 мая 2009

Обработка XML очень удобна для обработки большого числа параметров. Вы можете легко передать свои параметры в XML и затем обработать xml, чтобы получить ваши значения. Еще лучше, если ваши данные уже .Net.

, например

DECLARE @WidgetsIds xml
SET @WidgetsIds ='<Widgets><id>3</id><id>6</id><id>15</id></Widgets >' 

SELECT
ParamValues.ID.value('.','VARCHAR(20)')
FROM @Widgets.nodes('/widgets/id') as ParamValues(ID) 

Это должно вернуть 3 строки: 3, 6, 15. Это легко открыть, чтобы извлечь нужные значения и манипулировать ими.

3 голосов
/ 08 мая 2009

Если вы можете выполнить обновление до SQL Server 2008, для этой цели есть новая функция с именем Table-Valued Parameter. См. Раздел Books Online .

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

Из .NET вы можете просто использовать экземпляр DataTable и передавать ему произвольное количество строк внутри этой таблицы данных.

Марк

2 голосов
/ 09 мая 2009

Хорошо, это, скорее всего, будет понижено, но ... Только не передавайте так много параметров. Вместо того, чтобы пытаться найти способ сделать что-то сложное в языке, возможно, вы поймете, что это способ сказать вам, что вам нужно переделать то, что вы делаете. Подобно тому, как многие насекомые используют цвет для обозначения «не ешь», когда вы обнаруживаете, что делаете что-то базовое, для выполнения которого требуется много обручей, возможно, вам нужно переосмыслить то, что вы делаете.

В частности, я думаю, что, возможно, вам следует попытаться выяснить, почему хранимой процедуре требуется так много параметров; Вы можете разложить это на набор меньших, более простых хранимых процедур? Возможно, если они будут общаться через временные таблицы, вы можете получить тот же эффект, но с меньшими затратами ... ick.

2 голосов
/ 08 мая 2009

Сколько параметров вы считаете «большим числом»? Кроме того, почему хранимая процедура имеет так много параметров? Похоже, это будет весело для тестирования.

Каким образом код, который вызывает хранимую процедуру, получит данные, необходимые для передачи параметров? Если данные уже доступны в XML, то XML может быть хорошим способом их передачи. Если данные уже доступны в отдельных переменных, тогда объекты Parameters могут быть лучше.

Обратите внимание, что в SQL Server 2008 у вас есть возможность отправить DataTable в качестве значения параметра типа TABLE.


РЕДАКТИРОВАТЬ: Простой способ настройки параметров

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

  1. Создайте новый набор данных с помощью «Добавить новый элемент» и выберите «Набор данных». Назовите DataSet как хотите.
  2. Просмотр обозревателя серверов, если вы его еще не просматривали
  3. Добавить соединение в вашу базу данных, если его там еще нет
  4. Расширяйте соединение, пока не найдете хранимую процедуру
  5. Перетащите хранимую процедуру на поверхность конструктора

Это создаст TableAdapter с методом для вызова вашей хранимой процедуры. Метод зависит от объектов SqlParameter, которые инфраструктура уже создала. Метод примет параметры SP, переданные в качестве параметров вызова метода, и будет использовать параметры вызова для заполнения параметров SP. Все это сделано для вас, и сделано достаточно эффективно.

0 голосов
/ 11 мая 2009

В выпуске журнала SQL Server за февраль 2009 года есть отличная статья об использовании массивов (дополнительные параметры для обработки массивов как входных данных). В статье рассказывается об использовании CLR split UDF. Это работает с SQL 2005, так как имеет интеграцию с CLR. Это слишком много кода для меня, чтобы публиковать здесь и объяснять, но если у вас есть доступ к сайту журнала, я рекомендую загрузить их функцию для этого. Это быстро и элегантно.

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