Можно ли написать хранимую процедуру с динамическими параметрами, такими как sp_executesql? - PullRequest
0 голосов
/ 22 октября 2008

Можно ли написать хранимую процедуру (в tsql или других вариантах) с динамическими параметрами, такими как sp_executesql?

т.е. количество и тип параметров заранее неизвестны и должны динамически создаваться на стороне клиента. просто как вы можете передать любое количество параметров любого типа в sp_executesql.

Ответы [ 7 ]

1 голос
/ 22 октября 2008

вы можете передать массив в виде строки с некоторыми разделителями, такими как val1 $ datatype1 $; val2 $ datatype2 ... используйте цикл для построения строки. немного старая школа, но это легко сделать на стороне клиента и сервера.

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

Если у вас есть более сложные действия со значениями, вы можете рассмотреть возможность использования .NET-процедур на стороне сервера.

0 голосов
/ 23 октября 2008

Да, всегда можно собрать всю строку sql и передать ее хранимой процедуре. Но в этом случае вы не получите преимуществ производительности и безопасности при параметризации sql. Вся причина sp_executesql предпочтительнее, чем adhoc sql. Если у меня нет другого выбора, мне придется сделать что-то подобное (хотя и немного по-другому)

0 голосов
/ 22 октября 2008

тип и номер неизвестны? Вы можете использовать .getType () для отдельных параметров и .Longth массива, чтобы получить это. Создайте из него фрагмент XML и вставьте его как один параметр в SP с одним входным параметром xml. .getType () работает и с обычными объектами (), если им были назначены типизированные объекты.

0 голосов
/ 22 октября 2008

Взгляните на принятый ответ в этом вопросе . Здесь предлагается использовать встроенные в MS SQL функции XML для создания динамического предложения where.

Чтобы уточнить: я предлагаю вам обернуть ваши динамические параметры в XML.

0 голосов
/ 22 октября 2008

для уточнения, это будет похоже на C #:

void StoredProcedure (params object [] dynamicFields)

{

// Начало транса

// ... некоторые работы здесь

sp_executesql (SQL11, dynamicFields);

// ... некоторые работы здесь

sp_executesql (SQL22, dynamicFields);

// ... некоторые работы здесь

sp_executesql (SQL33, dynamicFields);

// ... некоторые работы здесь

// commit tran

}

Вы можете позвонить с любым номером или типом параметров или думай C ++ var args

0 голосов
/ 22 октября 2008

Я использую настраиваемые поля. тип и номер неизвестны.

Я могу использовать sp_executesql. проблема не в 1,2,3 простых обновлениях. Это похоже на передачу длинной хранимой процедуры в sp_executesql. учитывая небольшие различия, это создает проблемы с производительностью.

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

Подводя итог производительности является главной проблемой

0 голосов
/ 22 октября 2008

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

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

Есть ли веская причина, по которой вы не хотите использовать sp_executesql?

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