Количество таблиц результатов хранимых процедур - PullRequest
0 голосов
/ 15 января 2009

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

Можно ли как-нибудь получить эту информацию программно? Существуют ли какие-либо инструменты статистики, которые могли бы сделать это для меня?

Изменить - чтобы было ясно, я ищу количество наборов результатов, а не количество ссылочных таблиц.

Ответы [ 6 ]

2 голосов
/ 19 января 2009

Можно ли как-нибудь получить эту информацию программно?

Краткий ответ Нет , на сервере SQL невозможно получить количество наборов результатов, возвращаемых процедурой, поскольку число наборов результатов, возвращаемых хранимым процедурой, может быть динамическим и зависеть от значений. параметров, передаваемых в хранимых процессах.

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

Имея это в виду:

  • В чистом TSQL нет способа определить количество наборов результатов, которые возвращает proc, чем дальше, тем больше невозможно получить более 1 набора результатов, используя шаблон вставки exec

  • Возможно, вы могли бы что-то запутать с помощью SQL CLR, который подсчитывает наборы результатов. (Вам придется выполнить процедуру с фиктивными параметрами и откатить транс)

  • Вы могли бы написать что-нибудь в C # или любом другом клиентском инструменте, который, создает trans, внедряет фиктивные параметры, выполняет, подсчитывает наборы результатов и откатывает транзакцию.

0 голосов
/ 19 января 2009
SET FMTONLY ON

Вероятно, будет делать то, что вам нужно.

Но у этого есть некоторые ограничения - связанные с использованием временной таблицы (те же проблемы, которые возникают у LINQ и SSIS при попытке определить, что делают некоторые SP).

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

0 голосов
/ 19 января 2009

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

ЕСЛИ XXXX НАЧИНАЕТСЯ
ВЫБЕРИТЕ хххх
ВЫБЕРИТЕ хххх
END
ELSE
НАЧАТЬ
ВЫБЕРИТЕ хххх
ВЫБЕРИТЕ хххх
ВЫБЕРИТЕ хххх
ВЫБЕРИТЕ хххх
КОНЕЦ

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

0 голосов
/ 15 января 2009

Меня беспокоит то, что он запрашивает количество таблиц, возвращаемых хранимыми процедурами. Если хранимая процедура возвращает результаты оператора SQL select, она вполне может вернуть данные из нескольких таблиц. В этом случае количество наборов результатов не равно количеству таблиц.

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

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

РЕДАКТИРОВАТЬ: Интересно, что этот ответ продолжает отклоняться. Это было написано, когда вопрос был впервые опубликован, прежде чем он прояснил свой вопрос. В то время мои опасения были в силе. Я не знаю, привели ли они к тому, чтобы он прояснил свой вопрос, но наводит на размышления, что люди стремятся понизить ответ, не предоставив комментарий для оправдания понижения.

0 голосов
/ 15 января 2009

Вы можете создать классическую оболочку ADO для вызова sprocs и подсчета количества возвращаемых наборов записей (метод NextRecordSet). Итерируйте их (используя запрос к словарю данных, если необходимо, чтобы получить список) и смотрите. При отсутствии каких-либо других подходящих инструментов вы можете сделать это в VBA из Excel. Загрузите и установите соответствующую версию MDAC , если в системе не установлены библиотеки ADO.

0 голосов
/ 15 января 2009

под DB2:

select result_sets from syscat.procedures where procname='...'

дает приблизительное количество возвращаемых таблиц.

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