sql >> Database >  >> RDS >> Sqlserver

Een subset van kolommen selecteren uit de resultatenset van een opgeslagen procedure (T-SQL)

Heb je ooit een opgeslagen procedure uitgevoerd, maar werd je overweldigd door het aantal geretourneerde kolommen? Misschien had je maar één of twee kolommen nodig, maar het bood je manier te veel kolommen voor uw behoeften bij deze specifieke gelegenheid.

Gelukkig is er een kleine truc die u kunt gebruiken om geselecteerde kolommen uit een opgeslagen procedure op te halen. Hierdoor krijgt u precies de kolommen die u nodig heeft.

En het beste is dat je geen tijdelijke tabellen hoeft te maken en de gegevens niet hoeft te schudden.

Het enige wat u hoeft te doen is uw opgeslagen procedure doorgeven aan de OPENROWSET() functie.

Hetzelfde concept kan worden toegepast op de OPENQUERY() functie.

Voorbeeld

Neem de sp_columns systeem opgeslagen procedure bijvoorbeeld. Het geeft 19 kolommen terug.

EXEC sp_columns Cats;

Resultaat:

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

Bij dit soort procedures moeten we vaak zijwaarts scrollen in een wilde achtervolging om de kolommen te vinden waarin we geïnteresseerd zijn.

Misschien willen we gewoon 4 specifieke kolommen zien in plaats van alle 19.

We kunnen de volgende query uitvoeren om precies dat te doen.

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;

Resultaat:

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

De OPENROWSET() functie is voornamelijk ontworpen voor het ophalen van externe gegevens, maar u kunt het ook op de lokale instantie gebruiken door localhost op te geven in de verbindingsreeks (zoals ik in dit voorbeeld heb gedaan).

De OPENQUERY() Functie

Zoals vermeld, kan hetzelfde concept worden toegepast op de OPENQUERY() functie.

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

Resultaat:

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

In dit geval heb ik een gekoppelde server gespecificeerd met de naam Homer in plaats van de lokale server.

Als u een foutmelding krijgt met de melding "Server is niet geconfigureerd voor GEGEVENSTOEGANG", moet u gegevenstoegang voor de server inschakelen, zelfs als u uw lokale instantie opvraagt. Zie Gegevenstoegang in-/uitschakelen voor instructies over hoe u dit kunt doen.


  1. Zijn GUID-botsingen mogelijk?

  2. Hoe installeer ik de pg gem van PostgreSQL op Ubuntu?

  3. Wat is Greenplum-database? Inleiding tot de Big Data-database

  4. Wat is bij het uitvoeren van een opgeslagen procedure het voordeel van het gebruik van CommandType.StoredProcedure versus het gebruik van CommandType.Text?