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

Come selezionare un sottoinsieme di colonne dal set di risultati di una stored procedure (T-SQL)

Hai mai eseguito una stored procedure, solo per essere sopraffatto dal numero di colonne restituite? Forse avevi bisogno solo di una o due colonne, ma ti ha presentato modo troppe colonne per le tue esigenze in questa particolare occasione.

Fortunatamente, c'è un piccolo trucco che puoi usare per recuperare le colonne selezionate da una stored procedure. Ciò ti consente di ottenere solo le colonne di cui hai bisogno.

E la parte migliore è che non comporta la necessità di creare tabelle temporanee e mescolare i dati in giro.

Tutto quello che devi fare è passare la tua procedura memorizzata a OPENROWSET() funzione.

Lo stesso concetto può essere applicato a OPENQUERY() funzione.

Esempio

Prendi le sp_columns ad esempio una procedura memorizzata di sistema. Restituisce 19 colonne.

EXEC sp_columns Cats;

Risultato:

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

Procedure come questa spesso ci richiedono di scorrere lateralmente in un inseguimento selvaggio per trovare le colonne che ci interessano.

Forse vogliamo solo vedere 4 colonne specifiche invece di tutte e 19.

Possiamo eseguire la seguente query per fare proprio questo.

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;

Risultato:

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

Il OPENROWSET() La funzione è stata progettata principalmente per recuperare dati remoti, ma puoi anche usarla sull'istanza locale, specificando localhost nella stringa di connessione (come ho fatto in questo esempio).

La funzione OPENQUERY()

Come accennato, lo stesso concetto può essere applicato a OPENQUERY() funzione.

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

Risultato:

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

In questo caso, ho specificato un server collegato chiamato Homer invece del server locale.

Se ricevi un errore che dice "Il server non è configurato per l'ACCESSO AI DATI", dovrai abilitare l'accesso ai dati per il server, anche se stai interrogando la tua istanza locale. Vedi Come abilitare/disabilitare l'accesso ai dati per istruzioni su come farlo.