sys.columns (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

为包含列的对象(如视图或表)的每一列返回一行。 以下列表包含具有列的对象类型:

  • 表值程序集函数 (FT)
  • 内联表值 SQL 函数 (IF)
  • 内部表 (IT)
  • 系统表 (S)
  • 表值 SQL 函数 (TF)
  • 用户表 (U)
  • 视图 (V)
列名称 数据类型 描述
object_id int 此列所属对象的 ID。
name sysname 列的名称。 在对象中是唯一的。
column_id int 列的 ID。 在对象中是唯一的。 列 ID 可以不按顺序排列。
system_type_id tinyint 列的系统类型的 ID。
user_type_id int 用户定义的列类型的 ID。 若要返回类型的名称,请联接此列上的 sys.types 目录视图。
max_length smallint 列的最大长度(字节)。

-1 = 列数据类型为 varchar(max)nvarchar(max)varbinary(max)xml

对于 文本ntext图像 列, max_length 该值为 16 (仅表示 16 字节指针)或设置的值 sp_tableoption 'text in row'
precision tinyint 如果基于数值,则列的精度;否则,为 0.
scale tinyint 如果基于数值,则列的刻度;否则,为 0.
collation_name sysname 如果基于字符,则为该列排序规则的名称;否则为 NULL
is_nullable bit 1 = 列可为 null
0 = 列不可为 null
is_ansi_padded bit 1 = 如果字符、二进制或变体,则列使用 ANSI_PADDING ON 行为

0 = 列不是字符、二进制或变体
is_rowguidcol bit 1 = 列是声明的 ROWGUIDCOL
is_identity bit 1 = 列具有标识值
is_computed bit 1 = 列是计算列
is_filestream bit 1 = 列是 FILESTREAM 列
is_replicated bit 1 = 复制列
is_non_sql_subscribed bit 1 = 列具有非 SQL Server 订阅服务器
is_merge_published bit 1 = 列是合并发布的
is_dts_replicated bit 1 = 使用 SSIS 复制列
is_xml_document bit 1 = 内容是完整的 XML 文档

0 = 内容是文档片段,或者列数据类型不是 xml
xml_collection_id int 如果列的数据类型为 xml 且已输入 XML,则为非零值。 该值是包含列的验证 XML 架构命名空间的集合的 ID

0 = 无 XML 架构集合
default_object_id int 默认对象的 ID,无论它是独立对象 sp_bindefault还是内联列级 DEFAULT 约束。 内联列级默认对象的 parent_object_id 列是对该表本身的反引用。

0 = 无默认值
rule_object_id int 通过使用 绑定到列的独立规则的 ID sys.sp_bindrule.

0 = 无独立规则。 有关列级 CHECK 约束,请参阅 sys.check_constraints
is_sparse bit 1 = 列是稀疏列。 有关详细信息,请参阅 “使用稀疏列”。
is_column_set bit 1 = 列是列集。 有关详细信息,请参阅 “使用稀疏列”。
generated_always_type tinyint 标识何时生成列值(始终 0 用于系统表中的列)。

适用于:SQL Server 2016 (13.x) 及更高版本和 SQL 数据库。

0 = NOT_APPLICABLE
1 = AS_ROW_START
2 = AS_ROW_END

适用于:SQL Server 2022(16.x)及更高版本,以及SQL 数据库。

5 = AS_TRANSACTION_ID_START
6 = AS_TRANSACTION_ID_END
7 = AS_SEQUENCE_NUMBER_START
8 = AS_SEQUENCE_NUMBER_END

有关详细信息,请参阅时态表(关系数据库)
generated_always_type_desc nvarchar(60) 值的文本说明 generated_always_type (始终 NOT_APPLICABLE 用于系统表中的列)

适用于:SQL Server 2016 (13.x) 及更高版本和 SQL 数据库。

NOT_APPLICABLE
AS_ROW_START
AS_ROW_END

适用于:SQL Server 2022(16.x)及更高版本,以及SQL 数据库。

AS_TRANSACTION_ID_START
AS_TRANSACTION_ID_END
AS_SEQUENCE_NUMBER_START
AS_SEQUENCE_NUMBER_END
encryption_type int 加密类型:

1 = 确定性加密
2 = 随机加密

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
encryption_type_desc nvarchar(64) 加密类型说明:

RANDOMIZED
DETERMINISTIC

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
encryption_algorithm_name sysname 加密算法的名称。 仅支持 AEAD_AES_256_CBC_HMAC_SHA_512

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
column_encryption_key_id int 列加密密钥的 ID(CEK)。

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
column_encryption_key_database_name sysname 列加密密钥所在数据库的名称(如果不在列所在的数据库中)。 NULL(如果密钥与列位于同一数据库中)。

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
is_hidden bit 指示列是否可以隐藏:

0 = 常规列、不隐藏列、可见列
1 = 隐藏列

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
is_masked bit 指示列是否通过动态数据掩码屏蔽:

0 = 常规、非掩码列
1 = 列已屏蔽

适用于:SQL Server 2016(13.x)及更高版本,以及SQL 数据库
graph_type int 具有一组值的内部列。 这些值介于图形列和8图形列之间1,对于NULL其他列。
graph_type_desc nvarchar(60) 标识为仅供参考。 不支持。 不保证以后的兼容性。
is_data_deletion_filter_column bit 指示列是否为表的数据保留筛选列。

适用于: Azure SQL Edge
ledger_view_column_type int NULL否则,指示账本视图中列的类型:

1 = TRANSACTION_ID
2 = SEQUENCE_NUMBER
3 = OPERATION_TYPE
4 = OPERATION_TYPE_DESC

有关详细信息,请参阅 账本概述

适用于:SQL Server 2022(16.x)及更高版本,以及SQL 数据库
ledger_view_column_type_desc nvarchar(60) NULL如果没有,则包含账本视图中列类型的文本说明:

TRANSACTION_ID
SEQUENCE_NUMBER
OPERATION_TYPE
OPERATION_TYPE_DESC

适用于:SQL Server 2022(16.x)及更高版本,以及SQL 数据库
is_dropped_ledger_column bit 指示已删除的账本表列。

适用于:SQL Server 2022(16.x)及更高版本,以及SQL 数据库

权限

目录视图中仅显示用户拥有的安全对象的元数据,或用户对其拥有某些权限的安全对象的元数据。 有关详细信息,请参阅 Metadata Visibility Configuration

用法示例

获取表的列详细信息

若要获取表中列的元数据,可以使用以下代码:

CREATE TABLE dbo.[sample] (
    id INT NOT NULL
    ,col1 VARBINARY(10) NULL
    )
GO

SELECT c.[name] AS column_name
    ,t.[name] AS [type_name]
    ,c.[max_length]
    ,c.[precision]
    ,c.[scale]
FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE object_id = object_id('dbo.sample');