Pergunta

Eu preciso de uma maneira inteligente para obter os tipos de dados fora do INFORMATION_SCHEMA.COLUMNS de uma forma que poderia ser usado em uma instrução CREATE TABLE. O problema é que os campos 'extra' que precisam ser entendidas, como NUMERIC_PRECISION e NUMERIC_SCALE.

Obviamente, eu posso ignorar as colunas para INTEIRO (precisão de 10 e escala de 0), mas existem outros tipos eu estaria interessado em, tais como numérico. Então, sem escrever muito código para analisar a tabela, todas as idéias sobre como obter uma espécie de campo de taquigrafia para fora da definição de coluna?

Eu gostaria de ser capaz de obter algo como: int, data hora, dinheiro, numérica ** (10,2) **

Foi útil?

Solução

Aqui está uma atualização (ripoff!) De de GalacticCowboy resposta para corrigir alguns problemas e atualização para todos (eu acho) tipos de dados SQL Server 2008R2:

select data_type + 
    case
        when data_type like '%text' or data_type in ('image', 'sql_variant' ,'xml')
            then ''
        when data_type in ('float')
            then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ')'
        when data_type in ('datetime2', 'datetimeoffset', 'time')
            then '(' + cast(coalesce(datetime_precision, 7) as varchar(11)) + ')'
        when data_type in ('decimal', 'numeric')
            then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ',' + cast(coalesce(numeric_scale, 0) as varchar(11)) + ')'
        when (data_type like '%binary' or data_type like '%char') and character_maximum_length = -1
            then '(max)'
        when character_maximum_length is not null
            then '(' + cast(character_maximum_length as varchar(11)) + ')'
        else ''
    end as CONDENSED_TYPE
    , *
from information_schema.columns
order by table_schema, table_name, ordinal_position

Outras dicas

select column_type = data_type + 
    case
        when data_type like '%text' then ''
        when data_type like '%char' and character_maximum_length = -1 then '(max)'
        when character_maximum_length is not null then '(' + convert(varchar(10), character_maximum_length) + ')'
        when data_type = 'numeric' then '(' + convert(varchar(10), isnull(numeric_precision, 18)) + ', ' + 
            convert(varchar(10), isnull(numeric_scale, 0)) + ')'
        else ''
    end
,*
from information_schema.columns

SMO Scripting deve tomar cuidado com as gerações de script. Eu acredito que é isso que MS usa no SQL Management Studio para as gerações de script.

http://msdn.microsoft.com/en-us/library /ms162153.aspx

@YourComment - I need a smart way to get the data types out of INFORMATION_SCHEMA.COLUMNS in a way that could be used in a CREATE TABLE statement

Isto é o que você pediu. Menos do que isso, você terá que analisar os resultados Ver informações de esquema.

Se você estiver usando smo você pode obter tanto precisão e escala, acessando as propriedades colletion do Coluna objeto

Column.Property [ "NumericScale"]. Valor

Column.Property [ "NumericPrecision"]. Valor

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top