查询SQL Server系统表以获取字符数据类型大小

时间:2011-06-24 19:58:23

标签: sql-server tsql

我们正在将SQL Server 2008数据库中某列的数据类型从varchar(900)更改为nvarchar(900)。这将导致列的数据大小从900字节更改为1800字节。

此列包含在索引中,当我们对索引进行更改时,我们会收到警告

*警告!最大密钥长度为900字节。索引'INX_SomeTable'的最大长度为1800字节。对于某些大值组合,插入/更新操作将失败。*

我们计划通过将字段大小从nvarchar(900)减少到nvarchar(450)来解决这个问题。我想确保没有任何列进入字段超过450个字符。

如何查询系统表或DMV以查找超过特定大小的所有字符字段(varchar或nvarchar)?

4 个答案:

答案 0 :(得分:1)

更新了答案......

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNS.DATA_TYPE IN ('nvarchar', 'varchar', 'char', 'nchar')
    AND CHARACTER_MAXIMUM_LENGTH > 450

答案 1 :(得分:1)

select OBJECT_NAME(object_id) as 'TableorView', name
from DB.sys.columns
WHERE system_type_id IN (167, 231, 175, 239)
AND max_length > 450

我为CHARNCHAR添加了系统类型,以防万一。

如果您想要其他类型,可以查看sys.types以获取列表。

答案 2 :(得分:1)

SELECT  *
FROM  INFORMATION_SCHEMA.COLUMNS
WHERE CHARACTER_MAXIMUM_LENGTH > 450

答案 3 :(得分:1)

这是一个结果集,其中包含仅针对要检索的类型的架构和限制。

SELECT 
            sch.name as 'Schema'
,           OBJECT_NAME(col.object_id) as 'TableorView'
,           col.name  as 'Column'
,           typ.name + ' (' + convert(varchar,col.max_length) + ')' as 'Type'
FROM        sys.objects AS o WITH (NOLOCK)
INNER JOIN  sys.schemas sch WITH (NOLOCK) 
ON          o.schema_id = sch.schema_id 
INNER JOIN  sys.columns col
ON          o.object_id = col.object_id
INNER JOIN  sys.types typ
ON          col.system_type_id = typ.system_type_id
WHERE       col.system_type_id IN (
                SELECT system_type_id 
                FROM sys.types
                WHERE name IN ('CHAR', 'NCHAR')     --Add Types you want here
                )
AND         sch.name NOT IN ('sys')                 --Add schemas you don't want here
ORDER BY 1,2,3