2014-01-24 72 views
0

我们已将数据库从int升级到bigint。不过,我们希望选择迁移回最后一个选项。那时我们需要将数据库改回来。SQL:遍历数据库中的所有列并更改类型

因此,基本上遍历所有表和列,如果类型== bigint更改为int。到目前为止,我还没有找到一个好办法来做到这一点。

我们支持bot postgres sql和sql server。不确定这可以以统一的方式完成,或者如果需要两个版本。

回答

2

您可以简单地生成ALTER语句

SELECT 'ALTER TABLE ' + TABLE_NAME + ' ALTER COLUMN ' + COLUMN_NAME + ' INT ' + CASE when IS_NULLABLE = 'NO' THEN 'NOT' END + ' NULL' + char(13) + 'GO' 

FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'bigint' 
+1

...和information_schema是标准的,尽管有时候类型名称之类的东西会有所不同,所以对于类型名称差异可能需要某些OR或CASE语句。 –

0

你可以在PostgreSQL创建一个函数来做到这一点:

CREATE OR REPLACE FUNCTION bigint_to_int() RETURNS VOID AS $$ 
DECLARE 

    m_Record RECORD; 

BEGIN 

    FOR m_Record IN 
    SELECT information_schema.columns.table_name, information_schema.columns.column_name 
    FROM information_schema.columns 
    WHERE information_schema.columns.data_type = 'bigint' 
    AND information_schema.columns.table_schema = 'public' 
    LOOP 

     EXECUTE 'ALTER TABLE ' || QUOTE_IDENT(m_Record.table_name) || ' ALTER COLUMN ' || QUOTE_IDENT(m_Record.column_name) || ' TYPE INTEGER;'; 

    END LOOP; 

END; 
$$ LANGUAGE plpgsql VOLATILE; 

然后,你可以调用它使用:

SELECT bigint_to_int(); 

你将不得不在SQL Server中做同样的事情,尽管...

相关问题