Как я могу найти таблицу со столбцом максимальной длины 256 из базы данных SQL?

#sql #sql-server

#sql #sql-server

Вопрос:

Мне нужно обновить столбцы определенных таблиц с максимальной длиной 256, так есть ли какой-нибудь простой способ поиска таблиц sql?

Комментарии:

1. sys.tables , sys.columns . Эти объекты полностью документированы .

Ответ №1:

Попробуйте это:

 SELECT DISTINCT OBJECT_NAME([object_id])
FROM sys.columns C
INNER JOIN sys.types T
    ON c.[system_type_id] = T.[system_type_id]
WHERE T.[name] IN ('VARCHAR', 'CHAR', 'NVARCHAR', 'NCHAR')
    AND C.[max_length] = 256;
  

Изображение, с которого вы хотите обновить все столбцы NVARCHAR(128) на NVARCHAR(256) . Вы можете использовать следующий скрипт:

 SELECT 'ALTER TABLE ['   SCHEMA_NAME(T.[schema_id])   '].['   OBJECT_NAME(T.[object_id])   '] ALTER COLUMN ['   C.[name]   '] NVARCHAR(512);'
FROM sys.tables T
INNER JOIN sys.columns C
    ON T.[object_id] = C.[object_id]
INNER JOIN sys.types TY
    ON c.[system_type_id] = TY.[system_type_id]
WHERE TY.[name] =  'NVARCHAR'
    AND C.[max_length] = 512;
  

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

Также обратите внимание, что max_length — это длина в байтах. Итак, для VARCHAR(128) его 128 , но для NVARCHAR оно удваивается.

Комментарии:

1. Неплохо. Но OP также хочет знать, в какой таблице находится столбец.

2. max_length — максимальная длина в байтах

Ответ №2:

Для этого вы можете использовать представления INFORMATION_SCHEMA

 SELECT
    TABLE_SCHEMA, TABLE_NAME 
FROM
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    DATA_TYPE in ('varchar', 'nvarchar') 
    and CHARACTER_MAXIMUM_LENGTH = 256;
  

Ответ №3:

Если вы хотите знать только таблицу для обновления

 SELECT DISTINCT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE CHARACTER_MAXIMUM_LENGTH = 256
  

но, если вы также хотите знать, какой столбец имеет длину 256 :

 SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE CHARACTER_MAXIMUM_LENGTH = 256