TSQL - план выполнения анализа для определения столбцов, возвращаемых хранимой процедурой - PullRequest
2 голосов
/ 10 августа 2009

Есть ли способ динамического определения (из кода .NET или TSQL) столбцов, которые будет возвращать хранимая процедура? Я хотел бы динамически генерировать функции-оболочки в .NET для моих хранимых процедур. Легко получить имена процедур / параметры / и т. Д. но я также хотел бы знать, какие столбцы ожидать, когда процедура возвращает данные (без выполнения этого SP). Возможно ли это?

Ответы [ 5 ]

4 голосов
/ 10 августа 2009

Это на самом деле очень сложно. Он отлично работает с UDF, так как они имеют более сильные метаданные, но хранимая процедура может сделать много неприятных вещей:

  • ветви (IF и т. Д.), Возвращающие совершенно разные формы
  • выполнить другую хранимую процедуру
  • выполнить динамический sql

Так очень, очень сложно. Есть два общих подхода:

  • попытка парсинга TSQL; болезненный
  • выполнить его со значениями по умолчанию (ноль и т. Д.) И проверить результат

Параметр SET FMTONLY ON часто используется для второго (чтобы избежать обновлений и т. Д.), Но учтите, что системные хранимые процедуры все еще выполняются (возможно, xp_sendmail?), Поэтому вы рискуете сделать ненужные вещи ...

4 голосов
/ 10 августа 2009

Я видел, как это было сделано, затем я кричал на разработчика клиента, который сделал это, и мы отошли от идеи.

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

Однако на нем есть статьи MSDN:

Редактировать: основываясь на других ответах, мы обычно не меняем вывод, основываясь на выражениях IF. Мы рассматриваем хранимые процедуры как методы (где, конечно, разумно), поэтому нам нужна стабильная подпись ...

1 голос
/ 10 августа 2009

Это тяжелая битва, которую вы обязательно проиграете. Просто представьте себе такую ​​процедуру:

create procedure usp_foo
     @p int
as
begin
if @p=1
  select col1 from table1;
if @p=2
  select col2 from table2;
if @p=3
  select col3 from table3;
end
0 голосов
/ 11 августа 2009

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

0 голосов
/ 10 августа 2009

Я так не думаю.

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

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

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