Узнайте, есть ли в колонке varchar 20 - PullRequest
1 голос
/ 11 ноября 2011

Цель:
Узнать, имеет ли столбец Имя varchar(20).Если true, измените таблицу и т. Д.

Проблема:
У меня есть проблема, чтобы выяснить, есть ли в столбце Firstname varchar 20 внутри (если существует) Все происходит в SQL Server 2008 R2

Стол Посох
Колонка:

Firstname varchar(20)  
Lastname varchar(100)
if Exists()   // Find out if column Firstname has varchar(20)
begin 

   // Alter table and its specific column

end 

Ответы [ 4 ]

6 голосов
/ 11 ноября 2011

Представление информационной схемы COLUMNS идеально подходит для этого.

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = [table] AND COLUMN_NAME = [column]
AND DATA_TYPE = 'varchar' AND CHARACTER_MAXIMUM_LENGTH = 20
5 голосов
/ 11 ноября 2011
IF EXISTS
    (SELECT *
    FROM    sys.columns c
    WHERE   c.object_id = OBJECT_ID('MySchema.MyTable')
    AND c.name = 'MyColumn'
    AND c.system_type_id = 167 --167 = varchar SELECT * FROM sys.types WHERE name = 'varchar'
    AND c.max_length = 20)
BEGIN
    ALTER TABLE MySchema.MyTable
    ALTER COLUMN MyColumn VARCHAR(25) NULL; --or NOT NULL and/or DEFAULT ...
END
4 голосов
/ 26 июня 2012

При использовании sys.columns - помните, что столбец max_length фактически является максимальным размером в байтах, а не фактическим объявленным размером столбца.

См. Здесь для получения дополнительной информации: sys.columns на MSDN

Это нормально работает для char / varchar (где размер n байт), но для nchar и nvarchar хранилище байтов отличается, где n - длина строки .

nchar - 2 n байт, поэтому вам нужно будет сделать max_length/2, чтобы получить фактический объявленный размер (1-4000)

nvarchar также составляет 2 n байт, поэтому вам нужно будет сделать (max_length/2), чтобы получить фактический объявленный размер. Хотя nvarchar также использует дополнительные 2 байта для каждого столбца, он не включен в столбец sys.columns.max_length.

Также помните: любые значения nvarchar или nchar (max) возвращают -1

Пример кода, выбирает все столбцы для всех таблиц и отображает сведения о типе: -

SELECT '[' + schema_name(t.[schema_id]) + '].[' + t.name + ']' AS TableName
            , '[' + c.name + ']' AS ColumnName
            , '[' + ty.name + ']' AS DataType
            , max_length_value = CASE WHEN c.max_length > -1
                AND (ty.name = 'nvarchar' 
                OR ty.name = 'nchar') THEN c.max_length/2 
            ELSE c.max_length END
            , max_length_bytes = c.max_length
            , c.is_nullable
        FROM sys.columns AS c
            INNER JOIN sys.tables AS t ON t.object_id = c.object_id
            INNER JOIN sys.types AS ty ON ty.system_type_id = c.system_type_id
                AND ty.user_type_id = c.user_type_id

nchar и nvarchar от MSDN : -

* +1033 * NCHAR [(* 1 036 * п )] Строковые данные Unicode фиксированной длины. n определяет длину строки и должен быть значением от 1 до 4000. Размер хранилища составляет два раза n байтов. Когда кодовая страница сопоставления использует двухбайтовые символы, размер хранилища по-прежнему составляет n байтов. В зависимости от строки размер хранилища n байтов может быть меньше значения, указанного для n. Синонимами ISO для nchar являются национальный символ и национальный символ.

NVARCHAR [( п | макс )] Строковые данные Unicode переменной длины. n определяет длину строки и может принимать значение от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ). Размер хранилища в байтах в два раза превышает фактическую длину введенных данных + 2 байта. Синонимы ISO для nvarchar - это разные национальные символы и разные национальные символы.

1 голос
/ 11 ноября 2011

Вы должны иметь возможность использовать что-то похожее на этот запрос, чтобы определить, является ли ваш столбец varchar (20). Это будет выбирать из представлений в информационной схеме и фильтровать по критериям для столбцов и таблиц.

select t.name 'Table'
    , c.name 'Column'
    , c.max_length
from sys.columns c
inner join sys.tables t on
    t.object_id = c.object_id
inner join sys.types y on
    y.system_type_id = c.system_type_id
where c.name = 'FirstName'
    and t.name = 'MyTable'
    and y.name = 'varchar'
    and c.max_length = 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...