Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать тип поля sql-запросом / 3 сообщений из 3, страница 1 из 1
11.05.2014, 16:15:16
    #38638007
pH20
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип поля sql-запросом
Как с помощью sql-запроса вывести тип поля в таблице, а еще лучше вывести длину поля.
Так получилось что пришлось пользоваться не программным api а парсить результат работы isql.exe (вот чтоб корректно спарсить вывод isql.exe и нужны такие данные).
...
Рейтинг: 0 / 0
11.05.2014, 16:25:08
    #38638010
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип поля sql-запросом
...
Рейтинг: 0 / 0
12.05.2014, 13:04:38
    #38638644
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать тип поля sql-запросом
pH20Как с помощью sql-запроса вывести тип поля в таблице, а еще лучше вывести длину поля.Поскребав по старым сусекам, нарыл тут кое-чё
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
select
    rf.rdb$relation_name tab_name
    ,rf.rdb$field_position fld_pos
    ,rf.rdb$field_name fld_name
    ,case f.rdb$field_type
        when 7 then 'smallint'
        when 8 then 'integer'
        when 10 then 'float'
        when 14 then 'char(' || cast(cast(f.rdb$field_length / cx.div as int) as varchar(5)) || ')'
        when 16 then -- dialect 3 only
          case f.rdb$field_sub_type
            when 0 then 'bigint'
            when 1 then 'numeric(15,' || cast(-f.rdb$field_scale as varchar(6)) || ')'
            when 2 then 'decimal(15,' || cast(-f.rdb$field_scale as varchar(6)) || ')'
            else 'unknown'
          end
        when 12 then 'date'
        when 13 then 'time'
        when 27 then -- dialect 1 only
          case f.rdb$field_scale
            when 0 then 'double precision'
            else 'numeric(15,' || cast(-f.rdb$field_scale as varchar(6)) || ')'
          end
        when 35 then iif(di=1, 'date', 'timestamp')
        when 37 then 'varchar(' || cast(cast(f.rdb$field_length / cx.div as int) as varchar(5)) || ')'
        when 261 then 'blob sub_type ' || f.rdb$field_sub_type || ' segment size ' || f.rdb$segment_length
        else 'unknown'
    end fld_type
    ,cx.fld_charset
    ,cx.fld_collation
from (select m.mon$sql_dialect di from mon$database m) m
join rdb$relation_fields rf on 1=1
join rdb$relations rr on rf.rdb$relation_name=rr.rdb$relation_name
join rdb$fields f on rf.rdb$field_source=f.rdb$field_name
left join (
    select
        co.rdb$character_set_id fld_cset_id,
        co.rdb$collation_id fld_coll_id,
        co.rdb$collation_name fld_collation,
        rdb$character_set_name fld_charset,
        decode( ce.rdb$character_set_name,  upper('utf8'), 4, upper('unicode_fss'), 3,  1) div
    from rdb$collations co
    join rdb$character_sets ce on co.rdb$character_set_id=ce.rdb$character_set_id
) cx on  f.rdb$character_set_id=cx.fld_cset_id and f.rdb$collation_id = cx.fld_coll_id
where
    coalesce(rf.rdb$system_flag,0)=0
    and coalesce(rr.rdb$system_flag,0)=0
    and rr.rdb$relation_type in (0,4,5)
;
(с вьюхами НЕ работает! Там вообще не поймёшь, откудова он длину полей берёт... :))
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как узнать тип поля sql-запросом / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]