In SQL Server können Sie die sp_columns
verwenden gespeicherte Systemprozedur, um Spalteninformationen für die angegebenen Objekte zurückzugeben, die in der aktuellen Umgebung abgefragt werden können. Zu solchen Objekten gehören Tabellen, Ansichten oder andere Objekte mit Spalten, wie z. B. Tabellenwertfunktionen.
Sie können Informationen für eine bestimmte Spalte abrufen oder alle Spalten aus einer bestimmten Tabelle, Ansicht usw. angeben.
Syntax
Die Syntax lautet wie folgt:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
Der @table_name
Argument ist das einzige erforderliche Argument. Dies ist der Name der Tabelle/des Objekts, aus der Sie die Spalteninformationen erhalten möchten.
Die anderen Argumente sind optional. Weitere Informationen zu diesen Argumenten finden Sie in der Microsoft-Dokumentation.
Diese gespeicherte Prozedur erfordert SELECT
und VIEW DEFINITION
Berechtigungen für das Schema.
Beispiel 1 – Informationen für eine bestimmte Spalte zurückgeben
Dieses Beispiel verwendet alle möglichen Argumente. Es gibt Informationen für eine bestimmte Spalte in einer bestimmten Tabelle von einem bestimmten Tabelleneigentümer in einer bestimmten Datenbank zurück.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Ergebnis (bei vertikaler Ausgabe):
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Application TABLE_NAME | Cities COLUMN_NAME | Location DATA_TYPE | -4 TYPE_NAME | geography PRECISION | 2147483647 LENGTH | 2147483647 SCALE | NULL RADIX | NULL NULLABLE | 1 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | 2147483647 ORDINAL_POSITION | 4 IS_NULLABLE | YES SS_DATA_TYPE | 23 (1 row affected)
Hier ist eine prägnantere Methode:
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Das gibt dieselben Ergebnisse zurück.
Beispiel 2 – Geben Sie nur eine Tabelle an
In diesem Beispiel wechsle ich zu einer anderen Datenbank und gebe nur den Tabellennamen an.
USE Music; EXEC sp_columns @table_name = 'Artists';
Ergebnis (bei vertikaler Ausgabe):
Changed database context to 'Music'. -[ RECORD 1 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId DATA_TYPE | 4 TYPE_NAME | int identity PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 -[ RECORD 2 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistName DATA_TYPE | -9 TYPE_NAME | nvarchar PRECISION | 255 LENGTH | 510 SCALE | NULL RADIX | NULL NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -9 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | 510 ORDINAL_POSITION | 2 IS_NULLABLE | NO SS_DATA_TYPE | 39 -[ RECORD 3 ]------------------------- TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ActiveFrom DATA_TYPE | -9 TYPE_NAME | date PRECISION | 10 LENGTH | 20 SCALE | NULL RADIX | NULL NULLABLE | 1 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | -9 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 3 IS_NULLABLE | YES SS_DATA_TYPE | 0 (3 rows affected)
Dies gibt Informationen für alle Spalten in der angegebenen Tabelle zurück.
Sie müssen sich jedoch in der richtigen Datenbank befinden. Wenn ich das vorherige Beispiel auf einer anderen Datenbank erneut ausführe, erhalte ich keine Ergebnisse.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Ergebnis:
Changed database context to 'WideWorldImporters'. (0 rows affected)
Beispiel 3 – Über den Tabellenqualifizierer
Wenn Sie @table_qualifier
angeben -Argument muss es mit der aktuellen Datenbank identisch sein. Ist dies nicht der Fall, wird ein Fehler zurückgegeben.
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Ergebnisse:
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
In diesem Beispiel habe ich zur Datenbank „Music“ gewechselt, aber dann einen Tabellenqualifizierer von „WideWorldImporters“ verwendet, was dazu führte, dass die Fehlermeldung 15250 zurückgegeben wurde.
In diesem Fall hätte ich einen Tabellenqualifizierer von „Musik“ verwenden sollen. Alternativ hätte ich das Argument auch ganz weglassen können.
Beispiel 4 – Aufrufe
Die Syntax ist unabhängig vom Objekttyp gleich. Hier ist ein Beispiel für das Abrufen von Spalteninformationen für eine Ansicht:
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Ergebnisse:
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Website TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56
Das sind Spalteninformationen für eine Ansicht.
Wenn ich in diesem Fall den Tabelleneigentümer aus der Abfrage weglasse, werden zwei Zeilen zurückgegeben:
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Ergebnisse:
-[ RECORD 1 ]------------------------- TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Sales TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | (NEXT VALUE FOR [Sequences].[CustomerID]) SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 -[ RECORD 2 ]------------------------- TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Website TABLE_NAME | Customers COLUMN_NAME | CustomerID DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56 (2 rows affected)
Es werden zwei Zeilen zurückgegeben, da es zwei Objekte namens „Kunden“ gibt. Das eine ist eine Ansicht und das andere eine Tabelle. Der Tabelleneigentümer für die Ansicht heißt „Website“, und der Tabelleneigentümer für die Tabelle heißt „Sales“.
Beispiel 5 – Tabellenwertfunktionen
Wie bereits erwähnt, können Sie auch Spalteninformationen für eine Tabellenwertfunktion abrufen.
Hier ist ein Beispiel für das Abrufen von Spalteninformationen für eine Tabellenwertfunktion. Auch hier ist die Syntax dieselbe.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Ergebnisse:
TABLE_QUALIFIER | WideWorldImporters TABLE_OWNER | Application TABLE_NAME | DetermineCustomerAccess COLUMN_NAME | AccessResult DATA_TYPE | 4 TYPE_NAME | int PRECISION | 10 LENGTH | 4 SCALE | 0 RADIX | 10 NULLABLE | 0 REMARKS | NULL COLUMN_DEF | NULL SQL_DATA_TYPE | 4 SQL_DATETIME_SUB | NULL CHAR_OCTET_LENGTH | NULL ORDINAL_POSITION | 1 IS_NULLABLE | NO SS_DATA_TYPE | 56