【问题标题】:SQL Server 2008: Bulk Datatype ChangeSQL Server 2008:批量数据类型更改
【发布时间】:2010-09-05 01:36:43
【问题描述】:

我有一个包含许多表的 SQL Server 2008 数据库。我一直在使用现在蹩脚的datetime 数据类型,并希望使用新的更好的datetime2。在我有日期时间字段的大多数地方,对应的列名是Timestamp。有什么地方可以从datatime 批量更改为datetime2

【问题讨论】:

  • 将 buld 和 bul 更改为 bulk。更容易理解;)

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

在 Management Studio 中运行,复制结果并粘贴到新的查询窗口中:

select 'ALTER TABLE ' + OBJECT_NAME(o.object_id) + 
    ' ALTER COLUMN ' + c.name + ' DATETIME2 ' +
    CASE WHEN c.is_nullable = 0 THEN 'NOT NULL' ELSE 'NULL' END 
from sys.objects o
inner join sys.columns c on o.object_id = c.object_id
inner join sys.types t on c.system_type_id = t.system_type_id
where o.type='U'
and c.name = 'Timestamp'
and t.name = 'datetime'
order by OBJECT_NAME(o.object_id)

【讨论】:

  • 我唯一要改变的是使用sys.tables而不是sys.objects来查找表名
【解决方案2】:

数据类型变更一般需要ALTER TABLE语句:

ALTER TABLE myTable ALTER COLUMN timestamp datetime2 [NOT] NULL

要将给定数据库和架构中的所有日期时间列更改为 datetime2:

DECLARE @SQL AS NVARCHAR(4000)
DECLARE @table_name AS NVARCHAR(255)
DECLARE @column_name AS NVARCHAR(255)
DECLARE @isnullable AS BIT

DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT c.table_name, 
           c.column_name, 
           CASE WHEN c.is_nullable = 'YES' THEN 1 ELSE 0 END AS is_nullable
      FROM INFORMATION_SCHEMA.COLUMNS c 
     WHERE c.data_type = 'datetime'
       AND c.table_catalog = 'your_database'
       AND c.table_schema = 'your_schema'
    -- AND c.table_name = 'your_table'

OPEN CUR
FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @table_name + ' ALTER COLUMN ' + @column_name + ' datetime2' + (CASE WHEN @isnullable = 1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable
END

CLOSE CUR;
DEALLOCATE CUR;

【讨论】:

  • 很好的答案,得到我的投票。不过,我总是将此类代码包装在事务中,以防万一出现问题。另请注意,如果您对列有约束(例如,插入 getdate() 的默认值),上述脚本将失败。
  • 但是您可以通过删除它们 (stackoverflow.com/questions/4215619/…) 然后再添加它们来解决该问题。
【解决方案3】:

这将是一种蛮力方法,但您始终可以使用 sys.columns 视图查找数据类型为 datetime 的所有列,获取表名和列名,然后使用游标遍历该列表,并为每个条目生成一个 ALTER TABLE 语句,如下所示:

ALTER TABLE @tablename ALTER COLUMN @columnname datetime2

然后使用EXEC 运行上述语句。显然,您需要同时拥有查询sys.columnsALTER 所有这些表的权限...

抱歉,此答案中没有更多代码 - 这台机器上没有 SSMS 的副本,并且无法从内存中记住所有这些的语法。 :)

【讨论】:

    【解决方案4】:

    我会使用一个查询窗口,并输出执行此操作所需的所有ALTER TABLE 语句。生成它们后,您可以针对数据库运行结果。

    如果您从 SYSCOLUMNS 中选择您想要的表和字段的名称,您可以生成您需要的语句,将数据库中的所有列更改为 datetime2

    ALTER TABLE {tablename} ALTER COLUMN {fieldname} datetime2 [NULL | NOT NULL]
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      SELECT
       'ALTER TABLE [' + Table_Schema+'].['+Table_Name
       +'] Alter Column ['+Column_Name+'] datetime2;'
       FROM
       INFORMATION_SCHEMA.COLUMNS
       WHERE DATA_TYPE='datetime';
      

      现在您拥有更改批量类型所需的所有脚本。

      参考:https://www.sqlservercentral.com/forums/topic/how-to-change-column-type-on-all-tables-of-a-certain-database

      【讨论】:

        猜你喜欢
        • 2014-11-11
        • 2010-12-04
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        相关资源
        最近更新 更多