Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wybrać podzbiór kolumn z zestawu wyników procedury składowanej (T-SQL)

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ć.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw obraz do pola obrazu SQL Server 2005 używając tylko SQL

  2. Hierarchiczna lista typów zdarzeń wyzwalających w SQL Server 2019

  3. Jak wyłączyć ograniczenie wyboru w programie SQL Server (przykłady T-SQL)

  4. Jak zmienić sortowanie na poziomie serwera uruchomionej instancji SQL Server?

  5. Jak utworzyć tabelę z kolumną tożsamości