SQL Server 2008: Bulk Datatype Change

前端 未结 4 708
失恋的感觉
失恋的感觉 2021-01-20 11:32

I have an SQL Server 2008 database with many tables. I\'ve been using the now lame datetime datatype and want to use the new and better datetime2.

4条回答
  •  庸人自扰
    2021-01-20 11:59

    Data type alteration generally requires ALTER TABLE statements:

    ALTER TABLE myTable ALTER COLUMN timestamp datetime2 [NOT] NULL
    

    To change all the datetime columns into datetime2 in a given database & schema:

    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;
    

提交回复
热议问题