目标:
找出列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
答案 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