Время прочтения: 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;',

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