Rac*_*SQL 6 sql-server metadata sql-server-2014
我做了这个查询,列出表、它的列、数据类型等:
select t.name as 'Table',
c.name 'Column',
ty.name 'Data_Type',
c.max_length as 'Max_Lenght',
c.is_nullable as 'Null',
c.is_identity as 'Identity'
from sys.tables t
join sys.columns c on t.object_id=c.object_id
join sys.types ty on c.system_type_id=ty.system_type_id
order by 1
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
问题 1:
如何'Is primary key?'向其中添加列?我找不到可以帮助我的表(我看了看sys.indexes, sys.foreign_keys, INFORMATION_SCHEMA.table_constraints)。
问题 2:
在 中sys.columns,int 值具有max_lenghtas 4,还有一些其他字段。这是什么4?每个数据 4kb?datetime还有decimal。
谢谢。
Sol*_*zky 11
为每列添加“is_primary_key”字段的查询
该sys.key_constraints和sys.index_columns目录视图将确定PK列。您可以将它们连接在一起,然后将该集合用作派生表以将其左连接到您的主查询,这将允许不过滤掉不属于 PK 的列。
此外,您想使用[user_type_id]而不是[system_type_id]避免笛卡尔积。大多数情况下,这两个字段之间不会有区别。但是,如果您有用户定义的数据类型 (UDDT),或使用sysname数据类型(它是 的别名NVARCHAR(128)),则该[system_type_id]值将在sys.types目录视图中重复。
以下查询列出所有表中的所有字段,添加一个计算字段来表示该列是否属于 PK 的一部分。它也处理复合 PK。
SELECT tbl.[name] AS [TableName],
col.[name] AS [ColumnName],
ty.[name] AS [DataType],
col.[max_length] AS [MaxLength],
col.[is_nullable] AS [Nullable],
col.[is_identity] AS [Identity],
CONVERT(BIT, IIF(pkcol.index_id IS NOT NULL, 1, 0)) AS [PrimaryKey]
FROM sys.tables tbl
INNER JOIN sys.columns col
ON col.[object_id] = tbl.[object_id]
INNER JOIN sys.types ty
ON ty.[user_type_id] = col.[user_type_id] -- do not use system_type_id
LEFT JOIN (
SELECT ind.[object_id] AS [table_object_id], ind.[index_id], ind.[column_id]
FROM sys.index_columns ind
INNER JOIN sys.key_constraints pks
ON pks.[parent_object_id] = ind.[object_id]
AND pks.[unique_index_id] = ind.[index_id]
WHERE pks.[type] = 'PK'
) pkcol
ON pkcol.[table_object_id] = tbl.[object_id]
AND pkcol.[column_id] = col.[column_id]
ORDER BY tbl.[name], col.[name];
Run Code Online (Sandbox Code Playgroud)
max_length列信息
该max_length列sys.columns是的最大数量的字节,该列可以每行占用。对于固定长度的字段,如INT、DATETIME等,这些字段总是占用其最大空间量,除非您使用该SPARSE选项(按列设置)或启用了数据压缩(按索引设置)。
对于可变长度字段,例如VARCHAR,NVARCHAR,XML等,该值是的字节可能需要多达最大数量。的值-1表示约为2 GB(的值Int32.MaxValue),其使用由MAX(VARCHAR,NVARCHAR,和VARBINARY)和XML类型。
未声明为的 Unicode 字符串类型(NCHAR和NVARCHAR)MAX将显示max_lengthof,2 * declared_max因为(安全)假设它们每个“字符”使用 2 个字节。这不是不保证总是如此,因为补充字符实际上是每个“字符”4 个字节。但是,这就是为什么sysname作为 的别名 的NVARCHAR(128)amax_length为 256。类似地,允许在 8 位VARCHAR/CHAR字段中映射超过 256 个字符的不太常用的双字节字符集 (DBCS) 排序规则将存储字符1 或 2 个字节,取决于字符。意思是,对于VARCHAR使用 DBCS 归类的NVARCHAR数据,以及对于数据,将列或变量声明为VARCHAR(x)或NVARCHAR(x)x 个字符是可存储的:如果所有这些字符都是该类型的标准长度(即 1 个字节用于,2 个字节用于),则您只能容纳x 个字符。因此,一个字段最多可使用 6 个字节。可以容纳:3 个常规的两字节 Unicode 字符,或 1 个常规的两字节字符和 1 个 4 字节的补充字符(只有 2 个字符,而不是 3 个)。它不能容纳 2 个补充字符,因为这需要 8 个字节。VARCHARNVARCHARNVARCHAR(3)
不推荐使用的TEXT,NTEXT和IMAGE类型,没有人再使用(这是讽刺),显示 amax_length为 16,大概是留在数据页上的指针的大小,该指针指向保存数据的 LOB 页。
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |