我们正在将SQL Server 2008数据库中某列的数据类型从varchar(900)更改为nvarchar(900)。这将导致列的数据大小从900字节更改为1800字节。
此列包含在索引中,当我们对索引进行更改时,我们会收到警告
*警告!最大密钥长度为900字节。索引'INX_SomeTable'的最大长度为1800字节。对于某些大值组合,插入/更新操作将失败。*
我们计划通过将字段大小从nvarchar(900)减少到nvarchar(450)来解决这个问题。我想确保没有任何列进入字段超过450个字符。
如何查询系统表或DMV以查找超过特定大小的所有字符字段(varchar或nvarchar)?
答案 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
我为CHAR
和NCHAR
添加了系统类型,以防万一。
如果您想要其他类型,可以查看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