2

我正在尝试一次将所有表中的数据类型从更改textvarchar

这个查询

  select *
  from information_schema.columns
  where data_type = 'text'

向我展示了我所有的text数据类型,但是我如何使用它来将类型更改为varchar.

4

3 回答 3

1

我会将您的所有text,ntextimage数据类型更改为较新的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 图表模式下进行这些更改可能会更容易。

于 2013-03-25T14:22:26.880 回答
0

从查询结果中复制这些命令并执行它们:

    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'

但:

  • 您需要连接表信息以仅选择表(上面的查询也会返回视图)
  • 它不会让您更改某些列,例如使用 PK/FK 约束
  • 此选择还可能列出您不想/不能修改的表。例如系统图
  • 如果您不将其限制在您完全了解其结构的几个表中,那么这样做通常不是一个好主意。
于 2013-03-25T14:18:27.730 回答
0

起初它可能看起来很简单:

  1. 对来自 information_schema 的选择使用游标循环。
  2. 为将使用 ALTER TABLE 语句更改其数据类型的每个感兴趣的列编写动态 SQL。
  3. 执行动态 SQL。

但是,您需要先删除这些列上的任何索引、外键约束等。然后,当您完成后,您可以重新创建约束和索引。

看到这个问题:

单个 SQL 查询一次更新表中所有列的数据类型

于 2013-03-25T14:19:23.247 回答