Как передать большое количество параметров хранимой процедуры из кода в SQL Server - PullRequest
1 голос
/ 07 июня 2010

Как передать большое количество параметров (скажем, 20+) в хранимую процедуру из кода?

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

В настоящее время я должен создать более 20 переменных для передачи параметров.

Спасибо Ashwani

Ответы [ 4 ]

4 голосов
/ 07 июня 2010

Во-первых, посмотрите на дизайн, который требует так много параметров - есть ли способ уменьшить необходимость отправки такого большого количества информации на сервер?

Во-вторых, вернитесь к первому пункту снова, потому что он все еще "пахнет" неправильно: -)

Тогда вы можете делать такие вещи, как:

  • Разделить хранимую процедуру. Если вам не нужно передавать все данные в виде единого связанного кусочка, то вы можете разделить один SP на несколько, которые выполняют разные части общего действия (например, обновить имя пользователя и адресные данные отдельно от добавления их последней покупки, или что угодно)

  • объединить параметры. Если у вас есть пять логических значений, которые указывают различные параметры, вы можете объединить их в один байт «флагов» с побитовыми операциями. Или, если у вас есть два 32-разрядных типа int, которые содержат значения только от 0,5 до 5000, они могут быть объединены в одно 32-разрядное целое число. и т.д.

  • Сериализация всех параметров в «формате файла» и отправка данных в виде одного двоичного или текстового параметра, который вы десериализуете в своей хранимой процедуре.

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

3 голосов
/ 07 июня 2010

Если вы используете SQL Server 2008, используйте табличный параметр . Если вы не знакомы, это в основном позволяет передавать таблицу в качестве параметра хранимой процедуре. Преимущество состоит в том, что вы можете структурировать DataTable, который вы передаете, чтобы смотреть, как вы хотите.

Я сделал что-то подобное и вместо передачи десятков параметров я передал один TVP с двумя столбцами [KEY] и [VALUE]. Таким образом, когда ваши параметры изменятся в будущем, существует слой абстракции для изоляции миграции. Конечно, то, как вы решите это реализовать, зависит от ситуации.

0 голосов
/ 08 июня 2010

Лучший способ сделать это в 2.0 - это передать XML, содержащий все ваши параметры, в хранимую процедуру, а затем использовать OPENXML для получения каждого параметра.Используйте его по своему усмотрению, затем в SP.

См. Эти ссылки

Передача параметров в виде XML в хранимую процедуру и http://www.eggheadcafe.com/articles/20030627c.asp

0 голосов
/ 07 июня 2010

Обычно вам не нужно много переменных для хранения параметров;вам нужно будет добавить SqlParameter (и т. д.) в аргумент, но вы можете установить их в цикле (/etc).

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