sys.columns.max_length的替代品

Ren*_*ato 6 sql sql-server sql-server-2008

我编写了以下脚本来获取指定表的列的一些数据:

DECLARE @QueryTable varchar(35);
SET @QueryTable = 'Test';

SELECT DISTINCT
    sys.columns.name AS 'Column',
    sys.types.name AS 'Data type',
    CASE WHEN sys.types.name IN ('varchar', 'char') THEN CAST(sys.columns.max_length AS varchar(5))
    WHEN sys.types.name IN ('decimal', 'numeric') THEN CAST(CAST (sys.columns.precision AS nvarchar(10))  + ', ' + CAST(sys.columns.scale AS nvarchar(10)) AS nvarchar(10))
    WHEN sys.types.name IN ('nvarchar', 'nchar') THEN CAST(sys.columns.max_length / 2 AS varchar(5))
    ELSE '-' END AS 'Max size',
    CASE WHEN sys.columns.is_nullable = 1 THEN 'YES'
    WHEN sys.columns.is_nullable = 0 THEN 'NO' END AS 'Allow nulls',
    CASE WHEN sys.columns.name IN (SELECT Col.COLUMN_NAME from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.CONSTRAINT_NAME
    AND Col.Table_Name = Tab.TABLE_NAME
    AND Constraint_Type = 'PRIMARY KEY'
    AND Col.Table_Name = @QueryTable) THEN 'PK'
    ELSE '' END AS 'Primary Key'
FROM 
    sys.columns, sys.types, sys.tables
WHERE
    sys.tables.object_id = sys.columns.object_id AND
    sys.types.system_type_id = sys.columns.system_type_id AND
    sys.types.user_type_id = sys.columns.user_type_id AND
    sys.tables.name = @QueryTable
ORDER BY sys.columns.name
Run Code Online (Sandbox Code Playgroud)

当然,对于nvarcharnchar类型,我得到的max_length是该字段的实际最大字符长度的两倍.我的问题是,有没有我可以直接获得创建列时定义的实际最大字符长度,而不采用这种间接计算?

我用于输出数字/小数类型数据的方法在我看来也是一种混乱.

谢谢

Ale*_*lex 5

你有没有尝试过:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
Run Code Online (Sandbox Code Playgroud)

  • 注意:INFORMATION_SCHEMA.COLUMNS 是一个系统视图(不是这样的表)并且 msdn.microsoft.com/en-us/library/ms186778.aspx 说 INFORMATION_SCHEMA 是一个 ISO 标准,建议安全免于弃用,但是在 https:// msdn.microsoft.com/en-us/library/ms186224.aspx 我们看到: ** 重要 ** 不要使用 INFORMATION_SCHEMA 视图来确定对象的架构。查找对象架构的唯一可靠方法是查询 sys.objects 目录视图。INFORMATION_SCHEMA 视图可能不完整,因为它们并未针对所有新功能进行更新。 (3认同)