Есть ли способ определения хранимой процедуры SQL Server возвращает набор записей - PullRequest
3 голосов
/ 02 февраля 2011

У нас есть внутреннее приложение, которое генерирует код ASP для вызова хранимых процедур Oracle и SQL.

Это приложение запрашивает соответствующие словари данных и может определить информацию о параметрах и соответствующим образом построить вызов. Разработчик, использующий это приложение, может включить код в свой проект и передать ему данные с помощью специального DTO (также сгенерированного приложением).

В Oracle мы можем с радостью определить, возвращен ли набор записей, поскольку мы используем рефкурсоры, и они отображаются в списке параметров в Oracle DDL.

Это не относится к SQL Server. В настоящее время сами разработчики должны знать, возвращает ли SQL Server SP набор записей, и отметить опцию на интерфейсе. Это, в свою очередь, определяет, содержит ли генерируемый код ExecuteQuery или ExecuteNonQuery.

Хотя это нормально, было бы неплохо не иметь такой опции. Есть ли способ, которым он может быть определен программно, проверяя словарь данных или другими способами?

Спасибо

Джеймс

Ответы [ 4 ]

3 голосов
/ 02 февраля 2011

Вы можете проверить формат набора результатов, созданный оператором SQL, используя SET FMTONLY [ON|OFF].Такие инструменты MS, как Reporting Services, используют эту технику для определения структуры выходных результатов.

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

Я видел другие подходы (например, использование расширенных параметров), но ни один из них не является безошибочнымВозможно, лучшим решением будет сделать отметку для разработчиков.

2 голосов
/ 02 февраля 2011

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

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

1 голос
/ 02 февраля 2011

Это также может помочь: метаданные из хранимых процедур

0 голосов
/ 02 февраля 2011

Попробуйте изменить: - выберите o.name, p.name, t.name, p.max_length, p.is_output из sys.parameters p внутреннее соединение sys.objects o в o.object_id = p.object_id внутреннее соединениеsys.types t для t.user_type_id = p.user_type_id упорядочить по o.name;

(Вы можете создать это как представление).

...