sql - T-SQL : Convert datatime2 to datetime for all columns of type datetime2

标签 sql datetime alert datetime2

我有一个充满 datetime2 列的数据库,需要将其移动到 SQL 2005 数据库。所以,我需要将所有这些 datetime2(7) 列转换为 datetime。

我该怎么做呢?

现在我已经设法为所有具有 datetime2 数据类型的列选择表名和列名,如下所示:

SELECT t.name, c.name, i.DATA_TYPE
FROM sys.tables AS t
JOIN sys.columns c ON t.object_id = c.object_id
JOIN information_schema.columns i ON i.TABLE_NAME = t.name AND i.COLUMN_NAME = c.name
WHERE i.data_type = 'datetime2'

我只是不知道怎么做剩下的。

最佳答案

...然后您使用 CURSOR 迭代您的结果并动态运行 DDL,如:

ALTER TABLE myTable ALTER COLUMN myColumn datetime [NOT] NULL

以便您获得与此类似的内容(未测试):

编辑:还添加了可空性检查:
DECLARE @SQL AS NVARCHAR(1024)
DECLARE @TBL AS NVARCHAR(255)
DECLARE @COL AS NVARCHAR(255)
DECLARE @NUL AS BIT
DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT  t.name, c.name, c.is_nullable
    FROM    sys.tables AS t
    JOIN    sys.columns c ON t.object_id = c.object_id
    JOIN    information_schema.columns i ON i.TABLE_NAME = t.name AND i.COLUMN_NAME = c.name
    WHERE   i.data_type = 'datetime2'
    ORDER BY t.name, c.name

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

CLOSE CUR;
DEALLOCATE CUR;

关于sql - T-SQL : Convert datatime2 to datetime for all columns of type datetime2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1446775/

相关文章:

sql - 我可以对 SQL 中的列中的不同值的计数进行限制吗?

python - 不支持的格式字符 'm'

c# - DateTime 上的 Json.NET 反序列化 - 不是正确的时间(-6 小时)

python - 脾气暴躁,TypeError : Could not be cast from dtype ('<M8[us]' ) to dtype ('<M8[D]' )

javascript - 文档中点击链接的警报索引

javascript - 为什么 IE 不显示此 alert()?

mysql - 相关子查询的 SQL 执行顺序

mysql - 减去具有不同行数的不同表的两列

javascript - Chrome 中的警报框性能

php - 选择两个表中的数据