Время прочтения: 3 мин.
Если в работе связанной с анализом базы данных SQL Server понадобится, например, для получения некоторых свойств данных, хранящихся в таблице, выполнить хранимую процедуру (stored procedure), то не все столбцы в результате вывода могут представлять интерес для этой задачи. Согласитесь, не всегда удобно прокручивать большую таблицу, чтобы увидеть необходимую информацию. В этой статье я поделюсь способом, который позволит получить только необходимые столбцы в результате выполнения хранимой процедуры.
Для демонстрации примера рассмотрим хранимую процедуру sp_columns.
Пример 1: используем функцию openrowset(). Предположим, в тестовой БД имеется таблица dbTest.ObjectCheck.
Для начала посмотрим результат вывода sp_columns для этой таблицы.
USE dbTest
GO
EXEC sp_columns ObjectCheck;
Возвращено 19 столбцов. Немного, но давайте я ограничу вывод только теми столбцами, которые интересны исходя из задачи: column_name, type_name, precision, length, is_nullable.
Выполним запрос:
SELECT
s.COLUMN_NAME,
s.TYPE_NAME,
s.PRECISION,
s.LENGTH,
s.IS_NULLABLE
FROM OPENROWSET(
'SQLOLEDB',
'LOCALSERVER\SQLEXPRESS;Trusted_Connection=yes;',
'EXEC dbTest.dbo.sp_columns ObjectCheck'
) s;
Результат вывода:
Примечание: если при выполнении запроса получаем сообщение об ошибке:
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server…
то необходимо включить нерегламентированные распределенные запросы:
sp_configure 'show advanced options', 1
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed', 1
RECONFIGURE;
GO
и повторить запрос с использованием openrowset() снова.
Пример 2: используем функцию openquery().
SELECT
s.COLUMN_NAME,
s.TYPE_NAME,
s.PRECISION,
s.LENGTH,
s.IS_NULLABLE
FROM OPENQUERY(
LOCALSERVER\SQLEXPRESS,
'EXEC dbTest.dbo.sp_columns ObjectCheck'
) s;
Результат вывода будет аналогичным.
В заключение отмечу, что несмотря на то, что функция openrowset() разработана для извлечения данных с удаленных источников, ее можно использовать на локальном экземпляре SQL Server, указав его в строке подключения.
'LOCALSERVER\SQLEXPRESS;Trusted_Connection=yes;',
Применяя эти методы можно получать необходимое подмножество столбцов из результата выполнения хранимой процедуры и использовать этот набор результата в других параметрах кода.