找出列是否有varchar 20

时间:2011-11-11 13:06:20

标签: sql sql-server sql-server-2008 alter

目标:
找出列Firstname是否有varchar(20)。如果为true,则更改表等。

问题:
我有问题要查明列名是否包含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 个答案:

答案 0 :(得分:6)

COLUMNS信息架构视图非常适用于此。

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = [table] AND COLUMN_NAME = [column]
AND DATA_TYPE = 'varchar' AND CHARACTER_MAXIMUM_LENGTH = 20

答案 1 :(得分:5)

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

答案 2 :(得分:4)

如果使用sys.columns - 请记住max_length列实际上是以字节为单位的最大大小 - 而不是列的实际声明大小。

有关详细信息,请参阅此处:sys.columns on 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 and nvarchar from MSDN: -

<强>的nchar [(名词)] 固定长度的Unicode字符串数据。 n定义字符串长度,并且必须是1到4,000之间的值。存储大小是n个字节的两倍。当排序规则代码页使用双字节字符时,存储大小仍为n个字节。根据字符串,n个字节的存储大小可能小于为n指定的值。 nchar的ISO同义词是国家字符和国家字符。

<强> nvarchar的 [(名词 |的最大)] 可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储大小为2 ^ 31-1个字节(2 GB)。存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。

答案 3 :(得分:1)

您应该能够使用与此查询类似的内容来查找您的列是否为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