我正在尝试一次将所有表中的数据类型从更改text
为varchar
。
这个查询
select *
from information_schema.columns
where data_type = 'text'
向我展示了我所有的text
数据类型,但是我如何使用它来将类型更改为varchar
.
我正在尝试一次将所有表中的数据类型从更改text
为varchar
。
这个查询
select *
from information_schema.columns
where data_type = 'text'
向我展示了我所有的text
数据类型,但是我如何使用它来将类型更改为varchar
.
我会将您的所有text
,ntext
和image
数据类型更改为较新的varchar(max)
,nvarchar(max)
和varbinary(max)
数据类型:
select 'alter table ' + quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)
+ ' alter column ' + quotename(c.COLUMN_NAME) + ' '
+ case c.DATA_TYPE when 'image' then 'varbinary(max)' when 'ntext' then 'nvarchar(max)' when 'text' then 'varchar(max)' end + ' '
+ case c.IS_NULLABLE when 'YES' then 'not' else '' end + ' null;' as SqlCommand
, *
from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t on c.TABLE_CATALOG = t.TABLE_CATALOG
and c.TABLE_SCHEMA = t.TABLE_SCHEMA
and c.TABLE_NAME = t.TABLE_NAME
where c.DATA_TYPE in ('image', 'ntext', 'text')
and t.TABLE_TYPE = 'BASE TABLE'
只需将 SqlCommand 列作为批处理复制并运行。
这将处理可空性和过滤视图。
我不相信您可以在 text/ntext/image 列上放置任何类型的唯一约束,因此您可能不必检查 PK/FK/UK。但是,您必须考虑其他类型的约束和默认值。如果你有很多这些,在 SSMS 图表模式下进行这些更改可能会更容易。
从查询结果中复制这些命令并执行它们:
select
cmd = 'alter table [' + c.table_schema + '].[' + c.table_name + '] alter column [' + c.column_name + '] varchar(<yoursize>)'
,*
from information_schema.columns c
where c.data_type='text'
但:
起初它可能看起来很简单:
但是,您需要先删除这些列上的任何索引、外键约束等。然后,当您完成后,您可以重新创建约束和索引。
看到这个问题: