Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dapatkan Info Kolom untuk Tabel atau Tampilan di SQL Server (T-SQL:sp_columns)

Di SQL Server Anda dapat menggunakan sp_columns prosedur tersimpan sistem untuk mengembalikan informasi kolom untuk objek tertentu yang dapat ditanyakan di lingkungan saat ini. Objek tersebut mencakup tabel, tampilan, atau objek lain yang memiliki kolom seperti fungsi bernilai tabel.

Anda bisa mendapatkan informasi untuk kolom tertentu, atau Anda bisa menentukan semua kolom dari tabel, tampilan, dll.

Sintaks

Sintaksnya seperti ini:

sp_columns [ @table_name = ] object  
     [ , [ @table_owner = ] owner ]   
     [ , [ @table_qualifier = ] qualifier ]   
     [ , [ @column_name = ] column ]   
     [ , [ @ODBCVer = ] ODBCVer ]

@table_name argumen adalah satu-satunya argumen yang diperlukan. Ini adalah nama tabel/objek yang Anda inginkan informasi kolomnya.

Argumen lainnya adalah opsional. Untuk informasi selengkapnya tentang argumen ini, lihat dokumentasi Microsoft.

Prosedur tersimpan ini memerlukan SELECT dan VIEW DEFINITION izin pada skema.

Contoh 1 – Mengembalikan Informasi untuk Kolom Tertentu

Contoh ini menggunakan semua argumen yang mungkin. Ini mengembalikan informasi untuk kolom tertentu, dalam tabel tertentu, dari pemilik tabel tertentu, dalam database tertentu.

EXEC sp_columns
  @table_name = 'Cities', 
  @table_owner = 'Application',   
  @table_qualifier = 'WideWorldImporters',   
  @column_name = 'Location',
  @ODBCVer = 2;

Hasil (menggunakan keluaran vertikal):

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)

Berikut cara yang lebih ringkas untuk melakukannya:

EXEC sp_columns
  'Cities', 
  'Application',   
  'WideWorldImporters',   
  'Location',
  2;

Itu mengembalikan hasil yang sama.

Contoh 2 – Tentukan Tabel Saja

Dalam contoh ini saya beralih ke database lain dan hanya menentukan nama tabel.

USE Music;
EXEC sp_columns @table_name = 'Artists';

Hasil (menggunakan keluaran vertikal):

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)

Ini mengembalikan informasi untuk semua kolom dalam tabel yang ditentukan.

Anda harus berada di database yang benar sekalipun. Jika saya menjalankan kembali contoh sebelumnya pada database yang berbeda, saya tidak mendapatkan hasil.

USE WideWorldImporters;
EXEC sp_columns @table_name = 'Artists';

Hasil:

Changed database context to 'WideWorldImporters'.
(0 rows affected)

Contoh 3 – Tentang Tabel Qualifier

Jika Anda memberikan @table_qualifier argumen, itu harus sama dengan database saat ini. Jika tidak, kesalahan akan ditampilkan.

USE Music;
EXEC sp_columns
  @table_name = 'Artists',
  @table_qualifier = 'WideWorldImporters';

Hasil:

Msg 15250, Level 16, State 1, Line 24
The database name component of the object qualifier must be the name of the current database.

Dalam contoh ini saya beralih ke database "Musik", tetapi kemudian menggunakan kualifikasi tabel "WideWorldImporters", yang mengakibatkan kesalahan Msg 15250 dikembalikan.

Dalam hal ini, saya seharusnya menggunakan kualifikasi tabel "Musik". Atau, saya bisa menghilangkan argumen sama sekali.

Contoh 4 – Tampilan

Sintaksnya sama, apa pun jenis objeknya. Berikut ini contoh mendapatkan informasi kolom untuk tampilan:

EXEC sp_columns
  @table_name = 'Customers',
  @table_owner = 'Website',
  @column_name = 'CustomerID'; 

Hasil:

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

Itu adalah informasi kolom untuk tampilan.

Dalam hal ini, jika saya menghilangkan pemilik tabel dari kueri, dua baris akan dikembalikan:

EXEC sp_columns
  @table_name = 'Customers',
  @column_name = 'CustomerID'; 

Hasil:

-[ 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)

Dua baris dikembalikan karena ada dua objek yang disebut "Pelanggan". Salah satunya adalah pemandangan dan yang lainnya adalah meja. Pemilik tabel untuk tampilan disebut “Situs Web”, dan pemilik tabel untuk tabel disebut “Penjualan”.

Contoh 5 – Fungsi Bernilai Tabel

Seperti yang disebutkan, Anda juga bisa mendapatkan informasi kolom untuk fungsi bernilai tabel.

Berikut adalah contoh mendapatkan informasi kolom untuk fungsi bernilai tabel. Sekali lagi, sintaksnya sama.

EXEC sp_columns
  @table_name = 'DetermineCustomerAccess'; 

Hasil:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memeriksa Tingkat Kompatibilitas Database di SQL Server menggunakan T-SQL

  2. Ubah 'smalldatetime' menjadi 'date' di SQL Server (Contoh T-SQL)

  3. Lihat apakah Tabel memiliki Batasan DEFAULT di SQL Server menggunakan OBJECTPROPERTY()

  4. Kasus dalam Pernyataan Pilihan

  5. Hasilkan nilai DISTINCT di STRING_AGG