Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So wählen Sie eine Teilmenge von Spalten aus der Ergebnismenge einer gespeicherten Prozedur aus (T-SQL)

Haben Sie jemals eine gespeicherte Prozedur ausgeführt, nur um von der Anzahl der zurückgegebenen Spalten überwältigt zu werden? Vielleicht haben Sie nur eine oder zwei Spalten gebraucht, aber es hat Ihnen einen Weg gezeigt Zu viele Spalten für Ihre Bedürfnisse bei dieser besonderen Gelegenheit.

Glücklicherweise gibt es einen kleinen Trick, mit dem Sie ausgewählte Spalten aus einer gespeicherten Prozedur abrufen können. Dadurch erhalten Sie genau die Spalten, die Sie benötigen.

Und das Beste daran ist, dass Sie keine temporären Tabellen erstellen und die Daten verschieben müssen.

Sie müssen lediglich Ihre gespeicherte Prozedur an OPENROWSET() übergeben Funktion.

Das gleiche Konzept kann auf OPENQUERY() angewendet werden Funktion.

Beispiel

Nehmen Sie die sp_columns gespeicherte Systemprozedur zum Beispiel. Es gibt 19 Spalten zurück.

EXEC sp_columns Cats;

Ergebnis:

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

Verfahren wie dieses erfordern oft, dass wir in einer wilden Verfolgungsjagd seitwärts scrollen, um die Spalten zu finden, an denen wir interessiert sind.

Vielleicht möchten wir nur 4 bestimmte Spalten statt aller 19 sehen.

Dazu können wir die folgende Abfrage ausführen.

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;

Ergebnis:

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

Das OPENROWSET() Die Funktion wurde hauptsächlich zum Abrufen von Remote-Daten entwickelt, aber Sie können sie auch auf der lokalen Instanz verwenden, indem Sie localhost angeben in der Verbindungszeichenfolge (wie ich es in diesem Beispiel getan habe).

Die OPENQUERY()-Funktion

Wie bereits erwähnt, kann das gleiche Konzept auf OPENQUERY() angewendet werden Funktion.

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

Ergebnis:

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

In diesem Fall habe ich einen Verbindungsserver namens Homer angegeben Anstelle des lokalen Servers.

Wenn Sie die Fehlermeldung „Server ist nicht für DATENZUGRIFF konfiguriert“ erhalten, müssen Sie den Datenzugriff für den Server aktivieren, auch wenn Sie Ihre lokale Instanz abfragen. Anweisungen dazu finden Sie unter So aktivieren/deaktivieren Sie den Datenzugriff.