Запрос системных таблиц SQL Server для размеров символьных типов данных - PullRequest
2 голосов
/ 24 июня 2011

Мы меняем тип данных одного из столбцов в нашей базе данных SQL Server 2008 с varchar (900) на nvarchar (900). Это приведет к изменению размера данных столбца с 900 до 1800 байт.

Этот столбец включен в индекс, и когда мы вносим изменение в индекс, мы получаем предупреждение

* Внимание! Максимальная длина ключа составляет 900 байтов. Индекс INX_SomeTable имеет максимальную длину 1800 байт. Для некоторой комбинации больших значений операция вставки / обновления завершится неудачей. *

Мы планируем решить эту проблему, уменьшив размер поля с nvarchar (900) до nvarchar (450). Я хотел бы убедиться, что в поле не вставляются столбцы, длина которых превышает 450 символов.

Как я могу запросить системные таблицы или DMV, чтобы найти все символьные поля (varchar или nvarchar), которые превышают определенный размер?

Ответы [ 4 ]

1 голос
/ 21 апреля 2012

Вот результирующий набор, который включает в себя схему и ограничения только для типов, которые вы хотите получить.

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
1 голос
/ 25 июня 2011
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.

1 голос
/ 25 июня 2011
SELECT  *
FROM  INFORMATION_SCHEMA.COLUMNS
WHERE CHARACTER_MAXIMUM_LENGTH > 450
1 голос
/ 25 июня 2011

Обновленный ответ ...

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNS.DATA_TYPE IN ('nvarchar', 'varchar', 'char', 'nchar')
    AND CHARACTER_MAXIMUM_LENGTH > 450
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...