none
Alterar campos de um BD RRS feed

Respostas

  • Bom Dia,

    Segue uma primeira tentativa:

    SELECT
     'ALTER TABLE ' + TABLE_SCHEMA + '.' + TABLE_NAME +
     'ALTER COLUMN ' + COLUMN_NAME +
     CASE WHEN CHARACTER_OCTET_LENGTH > CHARACTER_MAXIMUM_LENGTH THEN 'NVARCHAR(' ELSE 'VARCHAR(' END +
     cast(CHARACTER_MAXIMUM_LENGTH as varchar(5)) + ')' +
     CASE IS_NULLABLE WHEN 'NO' THEN ' NOT NULL ' ELSE ' NULL' END
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE = 'CHAR'

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 23 de agosto de 2012 14:45
    • Marcado como Resposta cesarmene sexta-feira, 24 de agosto de 2012 11:56
    quinta-feira, 23 de agosto de 2012 14:45

Todas as Respostas

  • Bom Dia,

    Segue uma primeira tentativa:

    SELECT
     'ALTER TABLE ' + TABLE_SCHEMA + '.' + TABLE_NAME +
     'ALTER COLUMN ' + COLUMN_NAME +
     CASE WHEN CHARACTER_OCTET_LENGTH > CHARACTER_MAXIMUM_LENGTH THEN 'NVARCHAR(' ELSE 'VARCHAR(' END +
     cast(CHARACTER_MAXIMUM_LENGTH as varchar(5)) + ')' +
     CASE IS_NULLABLE WHEN 'NO' THEN ' NOT NULL ' ELSE ' NULL' END
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE = 'CHAR'

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 23 de agosto de 2012 14:45
    • Marcado como Resposta cesarmene sexta-feira, 24 de agosto de 2012 11:56
    quinta-feira, 23 de agosto de 2012 14:45
  • muito interessante, voce é o cara

    SELECT        DB_NAME() AS [database], TABELAS.name AS tabela, COLUNAS.name AS COLUNA, COLUNAS.xtype, TIPOS.name AS TIPO, COLUNAS.length AS TAMANHO,
                             COLUNAS.xprec, COLUNAS.xscale, COLUNAS.isnullable AS NULO
    FROM            sys.sysobjects AS TABELAS INNER JOIN
                             sys.syscolumns AS COLUNAS ON TABELAS.id = COLUNAS.id INNER JOIN
                             sys.systypes AS TIPOS ON COLUNAS.usertype = TIPOS.usertype
    WHERE        (TABELAS.xtype = 'U') AND (COLUNAS.xtype = 175)
    ORDER BY tamanho DESC

    com a visão que retorna acima posso fazer um update

    de  (TABELAS.xtype = 'U') AND (COLUNAS.xtype = 175) para  (TABELAS.xtype = 'U') AND (COLUNAS.xtype = 167)

    estou fazendo isto porque migrei uma base que tem muitas tabelas com char(200) e char(100) que não usam

    nem os 200 e nem os 100, e é uma base grande, assim pretendo com a conversão de char para varchar diminua o

    tamanho do banco de dados nos campos char com mais de 10

    quinta-feira, 23 de agosto de 2012 16:47
  • Boa Noite,

    Possivelmente você verá uma grande redução, mas após executar o comando pode ser necessário rodar um REBUILD nas tabelas para que o espaço livre possa ser observado.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    segunda-feira, 27 de agosto de 2012 23:51