Как я могу получить определение столбца SQL Server с круглыми скобками и все? - PullRequest
4 голосов
/ 31 октября 2008

Мне нужен умный способ получить типы данных из INFORMATION_SCHEMA.COLUMNS таким образом, чтобы их можно было использовать в операторе CREATE TABLE. Проблема заключается в «дополнительных» полях, которые необходимо понять, таких как NUMERIC _ PRECISION и NUMERIC _ SCALE.

Очевидно, я могу игнорировать столбцы для INTEGER (точность 10 и масштаб 0), но есть и другие типы, которые меня интересуют, например, NUMERIC. Таким образом, без написания большого количества кода для разбора таблицы, есть идеи, как получить своего рода сокращение поля из определения столбца?

Я бы хотел получить что-то вроде: ИНТ, Дата и время, Деньги, Числовой ** (10,2) **

Ответы [ 4 ]

7 голосов
/ 31 октября 2008
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
4 голосов
/ 28 июня 2012

Вот обновление (ripoff!) Ответ GalacticCowboy , чтобы исправить некоторые проблемы и обновить для всех (я думаю) типов данных 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
1 голос
/ 19 января 2009

Если вы используете smo, вы можете получить как точность, так и масштаб, перейдя в коллекцию Properties объекта Column

Column.Property [ "NumericScale"]. Значение

Column.Property [ "NumericPrecision"]. Значение

1 голос
/ 31 октября 2008

SMO Scripting должен заботиться о поколениях сценариев. Я считаю, что это то, что MS использует в SQL Management Studio для создания сценариев.

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

Это то, что вы просили. Если не считать этого, вам придется анализировать результаты просмотра информационной схемы.

...