2011-06-24 26 views
2

我们正在将SQL Server 2008数据库中某一列的数据类型从varchar(900)更改为nvarchar(900)。这将导致列的数据大小从900字节变为1800字节。针对字符数据类型大小的查询SQL Server系统表

此列包含在索引,当我们做出改变的指标,我们得到警告

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

我们计划通过将字段大小从nvarchar(900)减小到nvarchar(450)来解决此问题。我希望确保没有栏位超过450个字符。

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

回答

1
SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE CHARACTER_MAXIMUM_LENGTH > 450 
+0

这正是我需要的。谢谢!通过限制回来的列可以稍微改进这个答案。 –

1

更新答案...

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

他想要一个** FIELDS **的列表,这是返回一个表和视图列表。另外我认为你正在查看不推荐使用的SQL 2000系统表。 – JNK

+0

谢谢。我刚刚运行了一些类似的东西,但是你是对的......我用这个查询返回表格。 – Narnian

+0

我也想考虑数据类型VARCHAR,CHAR和NCHAR。 –

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中查看列表。

+0

这似乎没有返回我正在寻找的表和列的列表。 –

+0

@Eric - 您需要用您的数据库名称替换“DB”,或者如果您位于要检查的数据库上下文中,请将其删除。 – JNK

+0

好的,那有效。谢谢。 –

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 
相关问题