T-SQL:将datetime2的所有列的datatime2转换为datetime

Dav*_*och 3 sql alert datetime 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'
Run Code Online (Sandbox Code Playgroud)

我只是不知道如何做其余的事情.

van*_*van 5

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

ALTER TABLE myTable ALTER COLUMN myColumn datetime [NOT] NULL
Run Code Online (Sandbox Code Playgroud)

这样你得到类似的东西(未经测试):

编辑:添加了无效能力检查:

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;
Run Code Online (Sandbox Code Playgroud)