2

目标:
找出列 Firstname 是否具有varchar(20). 如果为真,请更改表格等。

问题:
我无法确定 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

4 回答 4

8

COLUMNS信息模式视图非常适合这种情况。

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = [table] AND COLUMN_NAME = [column]
AND DATA_TYPE = 'varchar' AND CHARACTER_MAXIMUM_LENGTH = 20
于 2011-11-11T13:30:45.410 回答
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
于 2011-11-11T13:28:41.077 回答
4

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

有关更多信息,请参见此处:MSDN 上的 sys.columns

这适用于 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

来自 MSDN 的 nchar 和 nvarchar:-

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

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

于 2012-06-26T05:51:44.807 回答
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
于 2011-11-11T13:23:09.063 回答