Pregunta

Necesito una forma inteligente de obtener los tipos de datos de INFORMATION_SCHEMA.COLUMNS de una manera que podría usarse en una declaración CREATE TABLE. El problema son los campos 'extra' que deben entenderse, como NUMERIC _ PRECISION y NUMERIC _ SCALE.

Obviamente, puedo ignorar las columnas de INTEGER (precisión de 10 y escala de 0), pero hay otros tipos en los que estaría interesado, como NUMERIC. Entonces, sin escribir un montón de código para analizar la tabla, ¿alguna idea sobre cómo obtener una especie de campo abreviado fuera de la definición de la columna?

Me gustaría poder obtener algo como: En t, fecha y hora, dinero, numérico ** (10,2) **

¿Fue útil?

Solución

Aquí hay una actualización (estafa) de La respuesta de GalacticCowboy para solucionar algunos problemas y actualizar para todos (creo) Tipos de datos de 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

Otros consejos

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 debe hacerse cargo de las generaciones de scripts. Creo que esto es lo que MS utiliza en SQL Management Studio para las generaciones de scripts.

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

@YourComment - Necesito una forma inteligente para eliminar los tipos de datos de INFORMATION_SCHEMA.COLUMNS de una manera que podría usarse en una declaración CREATE TABLE

Esto es lo que pediste. Aparte de eso, tendrá que analizar los resultados de la vista del esquema de información.

Si está usando smo, puede obtener precisión y escala accediendo a la colección de propiedades de Objeto de columna

Propiedad de la columna [" Escala numérica "]. Valor

Column.Property [" NumericPrecision "]. Value

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top