#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