sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan vælger du et undersæt af kolonner fra en lagret procedures resultatsæt (T-SQL)

Har du nogensinde kørt en lagret procedure, blot for at blive overvældet over antallet af returnerede kolonner? Måske havde du kun brug for en eller to kolonner, men det gav dig en måde for mange kolonner til dine behov ved denne særlige lejlighed.

Heldigvis er der et lille trick, du kan bruge til at hente udvalgte kolonner fra en lagret procedure. Dette gør det muligt for dig at få netop de kolonner, du har brug for.

Og det bedste er, at det ikke involverer at skulle oprette midlertidige tabeller og blande dataene rundt.

Alt du skal gøre er at sende din lagrede procedure til OPENROWSET() fungere.

Det samme koncept kan anvendes på OPENQUERY() funktion.

Eksempel

Tag sp_columns system lagret procedure for eksempel. Det returnerer 19 kolonner.

EXEC sp_columns Cats;

Resultat:

+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
| 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             |
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+

Procedurer som denne kræver ofte, at vi scroller sidelæns i en vild jagt for at finde de kolonner, vi er interesserede i.

Måske vil vi bare se 4 specifikke kolonner i stedet for alle 19.

Vi kan køre følgende forespørgsel for at gøre netop det.

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;

Resultat:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

OPENROWSET() Funktionen er primært designet til at hente fjerndata, men du kan også bruge den på den lokale instans ved at angive localhost i forbindelsesstrengen (som jeg har gjort i dette eksempel).

OPENQUERY()-funktionen

Som nævnt kan det samme koncept anvendes på OPENQUERY() funktion.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENQUERY(
    Homer,
    'EXEC Pets.dbo.sp_columns Cats'
    ) c;

Resultat:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

I dette tilfælde specificerede jeg en linket server kaldet Homer i stedet for den lokale server.

Hvis du får en fejlmeddelelse, der siger "Serveren er ikke konfigureret til DATAADGANG", skal du aktivere dataadgang for serveren, selvom du forespørger på din lokale instans. Se Sådan aktiverer/deaktiverer du dataadgang for instruktioner om, hvordan du gør dette.


  1. SQLSTATE[HY000] [1045] Adgang nægtet for brugeren 'brugernavn'@'localhost' ved hjælp af CakePHP

  2. Ugyldig syntaksfejltype=MyISAM i DDL genereret af Hibernate

  3. Hvorfor er IS NOT NULL falsk, når du tjekker en rækketype?

  4. Sådan finder du standardfilplaceringen for datafiler og logfiler i SQL Server