Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Nhận thông tin cột cho một bảng hoặc dạng xem trong SQL Server (T-SQL:sp_columns)

Trong SQL Server, bạn có thể sử dụng sp_columns hệ thống lưu trữ thủ tục để trả về thông tin cột cho các đối tượng được chỉ định có thể được truy vấn trong môi trường hiện tại. Các đối tượng như vậy bao gồm các bảng, dạng xem hoặc các đối tượng khác có các cột như các hàm có giá trị bảng.

Bạn có thể lấy thông tin cho một cột cụ thể hoặc bạn có thể chỉ định tất cả các cột từ một bảng, chế độ xem, v.v.

nhất định

Cú pháp

Cú pháp như sau:

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

@table_name đối số là đối số bắt buộc duy nhất. Đây là tên của bảng / đối tượng mà bạn muốn có thông tin cột.

Các đối số khác là tùy chọn. Để biết thêm thông tin về các đối số này, hãy xem tài liệu của Microsoft.

Thủ tục được lưu trữ này yêu cầu SELECTVIEW DEFINITION quyền trên giản đồ.

Ví dụ 1 - Trả lại thông tin cho một cột cụ thể

Ví dụ này sử dụng tất cả các đối số có thể. Nó trả về thông tin cho một cột cụ thể, trong một bảng cụ thể, từ chủ sở hữu bảng cụ thể, trong một cơ sở dữ liệu cụ thể.

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

Kết quả (sử dụng đầu ra dọc):

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)

Dưới đây là một cách ngắn gọn hơn để làm điều đó:

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

Điều đó trả lại kết quả tương tự.

Ví dụ 2 - Chỉ Chỉ định Bảng

Trong ví dụ này, tôi chuyển sang một cơ sở dữ liệu khác và chỉ xác định tên bảng.

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

Kết quả (sử dụng đầu ra dọc):

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)

Điều này trả về thông tin cho tất cả các cột trong bảng được chỉ định.

Tuy nhiên, bạn cần phải ở trong cơ sở dữ liệu chính xác. Nếu tôi chạy lại ví dụ trước đó trên một cơ sở dữ liệu khác, tôi không nhận được kết quả nào.

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

Kết quả:

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

Ví dụ 3 - Giới thiệu về Vòng loại bảng

Nếu bạn cung cấp @table_qualifier đối số, nó phải giống với cơ sở dữ liệu hiện tại. Nếu không, lỗi sẽ được trả lại.

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

Kết quả:

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

Trong ví dụ này, tôi đã chuyển sang cơ sở dữ liệu “Nhạc”, nhưng sau đó sử dụng bộ định lượng bảng của “WideWorldImporters”, dẫn đến lỗi Msg 15250 được trả về.

Trong trường hợp này, lẽ ra tôi nên sử dụng bảng định tính là “Âm nhạc”. Ngoài ra, tôi có thể đã bỏ qua hoàn toàn đối số.

Ví dụ 4 - Lượt xem

Cú pháp giống nhau, bất kể loại đối tượng. Dưới đây là một ví dụ về việc lấy thông tin cột cho một chế độ xem:

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

Kết quả:

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

Đó là thông tin cột cho một chế độ xem.

Trong trường hợp này, nếu tôi bỏ qua chủ sở hữu bảng khỏi truy vấn, hai hàng sẽ được trả về:

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

Kết quả:

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

Hai hàng được trả về vì có hai đối tượng được gọi là "Khách hàng". Một là một khung nhìn và một là một cái bàn. Chủ sở hữu bảng cho chế độ xem được gọi là "Trang web" và chủ sở hữu bảng cho bảng được gọi là "Bán hàng".

Ví dụ 5 - Các hàm được định giá trong bảng

Như đã đề cập, bạn cũng có thể nhận thông tin cột cho một hàm có giá trị bảng.

Dưới đây là một ví dụ về cách lấy thông tin cột cho một hàm có giá trị bảng. Một lần nữa, cú pháp giống nhau.

EXEC sp_columns
  @table_name = 'DetermineCustomerAccess'; 

Kết quả:

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. Làm cách nào để hiển thị cấu trúc bảng trong truy vấn SQL Server?

  2. Tương đương tốt nhất cho IsInteger trong SQL Server

  3. Nhận ngôn ngữ hiện đang được sử dụng trong SQL Server

  4. Khắc phục “Máy chủ SQL bị chặn truy cập vào STATEMENT‘ OpenRowset / OpenDatasource ’của thành phần‘ Truy vấn phân tán Ad Hoc ”

  5. Có thể truy cập cơ sở dữ liệu .mdf mà không có SQL Server không?