Czy kiedykolwiek uruchamiałeś procedurę składowaną tylko po to, aby przytłoczyć liczbę zwracanych kolumn? Być może potrzebujesz tylko jednej lub dwóch kolumn, ale to pokazało Ci sposób za dużo kolumn dla Twoich potrzeb w tej konkretnej okazji.
Na szczęście istnieje mała sztuczka, której można użyć, aby pobrać wybrane kolumny z procedury składowanej. Dzięki temu możesz uzyskać tylko te kolumny, których potrzebujesz.
A najlepsze jest to, że nie wymaga to tworzenia tabel tymczasowych i tasowania danych.
Wszystko, co musisz zrobić, to przekazać swoją procedurę składowaną do OPENROWSET()
funkcjonować.
Ta sama koncepcja może być zastosowana do OPENQUERY()
funkcja.
Przykład
Weź sp_columns
na przykład systemowa procedura składowana. Zwraca 19 kolumn.
EXEC sp_columns Cats;
Wynik:
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | RADIX | NULLABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE | |-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------| | Pets | dbo | Cats | CatId | 4 | int identity | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 1 | NO | 56 | | Pets | dbo | Cats | CatName | 12 | varchar | 60 | 60 | NULL | NULL | 1 | NULL | NULL | 12 | NULL | 60 | 2 | YES | 39 | +-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
Procedury takie jak ta często wymagają od nas przewijania w bok w dzikim pościgu, aby znaleźć interesujące nas kolumny.
Może po prostu chcemy zobaczyć 4 konkretne kolumny zamiast wszystkich 19.
W tym celu możemy uruchomić następujące zapytanie.
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;
Wynik:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
OPENROWSET()
funkcja została zaprojektowana głównie do pobierania danych zdalnych, ale można jej również używać na instancji lokalnej, podając localhost
w ciągu połączenia (tak jak zrobiłem w tym przykładzie).
Funkcja OPENQUERY()
Jak wspomniano, tę samą koncepcję można zastosować do OPENQUERY()
funkcja.
SELECT
c.COLUMN_NAME,
c.TYPE_NAME,
c.PRECISION,
c.LENGTH
FROM OPENQUERY(
Homer,
'EXEC Pets.dbo.sp_columns Cats'
) c;
Wynik:
+---------------+--------------+-------------+----------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |---------------+--------------+-------------+----------| | CatId | int identity | 10 | 4 | | CatName | varchar | 60 | 60 | +---------------+--------------+-------------+----------+
W tym przypadku określiłem połączony serwer o nazwie Homer
zamiast serwera lokalnego.
Jeśli pojawi się błąd, który mówi „Serwer nie jest skonfigurowany do dostępu do danych”, musisz włączyć dostęp do danych dla serwera, nawet jeśli wysyłasz zapytanie do lokalnej instancji. Zobacz Jak włączyć/wyłączyć dostęp do danych, aby dowiedzieć się, jak to zrobić.