Случвало ли ви се е да изпълнявате съхранена процедура, само за да бъдете претоварени от броя на върнатите колони? Може би сте имали нужда само от една или две колони, но това ви представи начин твърде много колони за вашите нужди по този конкретен повод.
За щастие има малък трик, който можете да използвате, за да извлечете избрани колони от съхранена процедура. Това ви позволява да получите точно необходимите колони.
И най-хубавото е, че не е необходимо да създавате временни таблици и да разбърквате данните наоколо.
Всичко, което трябва да направите, е да предадете вашата съхранена процедура на OPENROWSET()
функция.
Същата концепция може да се приложи към OPENQUERY()
функция.
Пример
Вземете sp_columns
например системна съхранена процедура. Връща 19 колони.
EXEC sp_columns Cats;
Резултат:
+------------------+--------------+---------- ----+--------------+------------+--------------+ -------------+-----------+--------+--------+----- -------+----------+--------------+-------------- --+-------------------+---------------------+---- ----------------+--------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | ТОЧНОСТ | ДЪЛЖИНА | МАЩАБ | RADIX | НУЛИВА | ЗАБЕЛЕЖКИ | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE ||---------------------+--------------+----------- ---+--------------+------------+--------------+- ------------+----------+--------+--------+------ ------+-----------+--------------+---------------- -+--------------------+---------------------+----- ---------------+--------------+----------------|| Домашни любимци | dbo | Котки | CatId | 4 | int идентичност | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 1 | НЕ | 56 || Домашни любимци | dbo | Котки | Име на котка | 12 | varchar | 60 | 60 | NULL | NULL | 1 | NULL | NULL | 12 | NULL | 60 | 2 | ДА | 39 |+-------------------+--------------+----------- ---+--------------+------------+--------------+- ------------+----------+--------+--------+------ ------+-----------+--------------+---------------- -+--------------------+---------------------+----- ---------------+--------------+----------------+предварително>Процедури като тази често изискват от нас да превъртаме настрани в преследване на дива гъска, за да намерим колоните, които ни интересуват.
Може би просто искаме да видим 4 конкретни колони вместо всичките 19.
Можем да изпълним следната заявка, за да направим точно това.
SELECT c.COLUMN_NAME, c.TYPE_NAME, c.PRECISION, c.LENGTH FROM OPENROWSET( 'SQLOLEDB', 'SERVER=localhost;Trusted_Connection=yes;', 'EXEC Pets.dbo.sp_columns Cats' ) c;
Резултат:
+--------------+--------------+------------+- ---------+| COLUMN_NAME | TYPE_NAME | ТОЧНОСТ | ДЪЛЖИНА ||--------------+--------------+------------+-- --------|| CatId | int идентичност | 10 | 4 || Име на котка | varchar | 60 | 60 |+--------------+--------------+------------+-- --------+
OPENROWSET()
функцията е проектирана главно за извличане на отдалечени данни, но можете да я използвате и в локалния екземпляр, като посочитеlocalhost
в низа за връзка (както направих в този пример).Функцията OPENQUERY()
Както споменахме, същата концепция може да се приложи към
OPENQUERY()
функция.SELECT c.COLUMN_NAME, c.TYPE_NAME, c.PRECISION, c.LENGTH FROM OPENQUERY( Homer, 'EXEC Pets.dbo.sp_columns Cats' ) c;
Резултат:
+--------------+--------------+------------+- ---------+| COLUMN_NAME | TYPE_NAME | ТОЧНОСТ | ДЪЛЖИНА ||--------------+--------------+------------+-- --------|| CatId | int идентичност | 10 | 4 || Име на котка | varchar | 60 | 60 |+--------------+--------------+------------+-- --------+В този случай посочих свързан сървър, наречен
Homer
вместо локалния сървър.Ако получите грешка, която гласи „Сървърът не е конфигуриран за ДОСТЪП ДО ДАННИ“, ще трябва да активирате достъпа до данни за сървъра, дори ако правите заявка за вашия локален екземпляр. Вижте Как да активирате/деактивирате достъпа до данни за инструкции как да направите това.