在哪里可以找到列数据类型的Sql Server元数据?

时间:2012-02-07 16:30:58

标签: sql-server tsql sql-server-2005 metadata

我知道我可以通过以下方式访问列属性:

select * 
from sysobjects

但是我找不到的信息是关于从哪里获取列的类型和类型长度,即:in

FOO VARCHAR(80)

在哪里可以找到元数据表中类型声明的“VARCHAR(80)”部分?

我尝试查看systypes表,但是xtype的值与sysobjects表中的xtype值不匹配。

*我无法访问用于构建这些表的原始SQL,也没有任何管理员权限。

如果您熟悉DB2,我正在寻找与

等效的东西
select name,
       coltype,
       length,
  from sysibm.syscolumns
where tbname = 'FOO'

3 个答案:

答案 0 :(得分:15)

你很亲密。您可以查看sys.columns以获取列。

您可以使用OBJECT_ID=OBJECT_ID('dbo.Foo')过滤表格。

您可以从sys.columns获取长度。数据类型位于system_type字段中。该字段的键位于sys.types

完全可以做到:

select object_NAME(c.object_id), c.name, t.name, c.max_length
from sys.columns c
INNER JOIN sys.types t
    ON t.system_type_id = c.system_type_id

作为旁注,在SQL Server中不推荐使用系统表(即syscolumnssysobjects),建议将其作为使用视图的最佳做法,{{1 },sys.columns

这将为您提供表格,列,数据类型和每个的最大长度。

答案 1 :(得分:4)

执行此操作的正确方法是加入sys.types表中的用户 _type_id:

select object_NAME(c.object_id), c.name, t.name, c.max_length
from sys.columns c
INNER JOIN sys.types t
    ON t.user_type_id = c.user_type_id

user_type_id与系统类型的system_type_id相同 - 请参阅文档:https://msdn.microsoft.com/en-gb/library/ms188021.aspx

答案 2 :(得分:1)

要以上述答案为基础,以与声明列相同的格式获取列数据类型通常很有用。

例如,varchar(50)varchar(max)decimal(p, s)

这允许您执行以下操作:

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length AS VARCHAR(25))) + ')' 
      WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length / 2 AS VARCHAR(25)))+ ')'      
      WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] + '(' + CAST(c.[precision] AS VARCHAR(25)) + ', ' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      WHEN tp.[name] IN ('datetime2') THEN tp.[name] + '(' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      ELSE tp.[name]
    END
, [RawType]      = tp.[name]
, [MaxLength]    = c.max_length
, [Precision]    = c.[precision]
, [Scale]        = c.scale
FROM sys.tables t 
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types tp ON c.user_type_id = tp.user_type_id
WHERE s.[name] = 'dbo' AND t.[name] = 'MyTable'