我知道我可以通过以下方式访问列属性:
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'
答案 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中不推荐使用系统表(即syscolumns
,sysobjects
),建议将其作为使用视图的最佳做法,{{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'