Как я могу получить определение столбца SQL Server со скобками и всем остальным?
-
05-07-2019 - |
Вопрос
Мне нужен умный способ извлечь типы данных из INFORMATION_SCHEMA.COLUMNS таким образом, чтобы их можно было использовать в инструкции CREATE TABLE.Проблема заключается в "дополнительных" полях, которые необходимо понимать, таких как ЧИСЛОВЫЕ_
ТОЧНОСТЬ и ЧИСЛОВОЕ_
МАСШТАБ.
Очевидно, что я могу игнорировать столбцы для ЦЕЛЫХ ЧИСЕЛ (точность 10 и масштаб 0), но есть другие типы, которые меня бы заинтересовали, такие как ЧИСЛОВЫЕ.Итак, без написания большого количества кода для разбора таблицы, есть какие-нибудь идеи о том, как получить своего рода сокращенное обозначение поля из определения столбца?
Я хотел бы иметь возможность получить что-то вроде :int, дата-время, деньги, числовое значение **(10,2)**
Решение
Вот обновление (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
Другие советы
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 должен заботиться о поколениях сценариев.Я полагаю, что это то, что MS использует в SQL Management Studio для генерации сценариев.
http://msdn.microsoft.com/en-us/library/ms162153.aspx
@YourComment @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
Это то, о чем вы просили.Если не считать этого, вам нужно будет проанализировать результаты просмотра информационной схемы.
Если вы используете smo, вы можете получить как точность, так и масштабирование, обратившись к разделу Свойств Объект Столбца
Столбец.Свойство["Числовая шкала"].Значение
Столбец.Свойство["Числовая точность"].Значение