如何更改DateTime中的所有表和列

时间:2018-12-14 13:50:04

标签: sql sql-server

我必须更改数据库中所有表(SQL Server)中所有作为日期的列,并将它们转换为DateTime。

我该怎么做?是命令吗?

4 个答案:

答案 0 :(得分:0)

更改数据类型必须调用的更改列命令是-> ALTER COLUMNALTER COLUMN命令只能在ALTER TABLE命令的上下文中调用。您很幸运,因为您要转换为的数据类型与转换兼容,并且只会加宽列。如果您尝试转换为不兼容的数据类型或需要较少存储空间的数据类型,则无法使用下面的简单命令。

ALTER TABLE YourTableName
ALTER COLUMN YouDateField DATETIME

答案 1 :(得分:0)

我认为这可以为您提供帮助:

执行脚本,您将在消息选项卡中看到更新列表。

DECLARE @SQLString VARCHAR(MAX)=''

SELECT @SQLString  = @SQLString +CHAR(13)+'ALTER TABLE '+T.TABLE_SCHEMA+'.'+T.TABLE_NAME+' ALTER COLUMN '+C.COLUMN_NAME+' DATETIME'
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.COLUMNS C ON T.TABLE_SCHEMA=C.TABLE_SCHEMA 
                                       AND T.TABLE_NAME=C.TABLE_NAME
WHERE C.DATA_TYPE='date'
AND T.TABLE_TYPE='BASE TABLE'

PRINT(@SQLString)

答案 2 :(得分:0)

您可以使用此查询来获取日期类型列的alter查询的集合。

SELECT 
  CONCAT('alter table ', TABLE_SCHEMA, '.', TABLE_NAME,  ' ALTER COLUMN ', COLUMN_NAME, ' DATETIME;') 
FROM INFORMATION_SCHEMA.COLUMNS
Where DATA_TYPE = 'date' and TABLE_SCHEMA not in ('information_schema', 'sys');

然后通过执行生成的结果,您的表列将被转换为DateTime

答案 3 :(得分:0)

使用sys.columnssys.types生成动态语句并执行生成的语句。 该语句还检查每列的nullabilityALTER TABLE ... ALTER COLUMN并非总是可行的解决方案。在某些情况下,您可能需要删除表并重新创建它,或添加新列,然后将旧列的值复制到新列中,然后删除原始列。

更改列时,请至少考虑以下内容:

  • 先前的数据类型必须隐式转换为新的数据类型
  • 新类型不能是时间戳。
  • ALTER COLUMN的ANSI_NULL默认值始终打开;如果未指定,则该列为空。

T-SQL:

DECLARE 
    @stm nvarchar(max),
    @err int

SELECT @stm = (
    SELECT CONCAT(
        'ALTER TABLE ', OBJECT_NAME(c.OBJECT_ID), 
        ' ALTER COLUMN ',
        c.name,
        ' datetime',
        CASE 
            WHEN c.is_nullable = 1 THEN ' NULL '
            ELSE ' NOT NULL '
        END,
        '; '
    )
    FROM sys.columns AS c
    JOIN sys.types AS t ON c.user_type_id = t.user_type_id
    WHERE t.name = 'date'
    ORDER BY c.OBJECT_ID
    FOR XML PATH('')
)

PRINT @stm
EXEC @err = sp_executesql @stm
IF @err = 0 
    PRINT 'OK'
ELSE 
    PRINT 'Error'