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

Spalteninformationen für eine Tabelle oder Ansicht in SQL Server abrufen (T-SQL:sp_columns)

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