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 SELECT
và VIEW 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