Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как хранить в таблице значения разных типов [D6, MSSQL]


AndrewK ©   (2003-12-17 13:29:00) 

Вопрос такой.

Как можно в одной таблице хранить значения разных типов и выдавать по требованию какой-либо один?

Пока придумал вот что:

Сделал таблицу
Library (
ID int identity (1,1),
DataType int /* 0 - Строка, 1 - Целое, 2 - Дробное, 3 - Дата/Время */
)

Values (
ID int identity (1,1),
Library_ID int, -- Ключ к полю ID таблицы Library
IntValue int,
FloatValue float,
CharValue varchar(255),
DateTimeValue datetime
)


В таблице Values, в зависимости от DataType таблицы Library в определенном столбце хранятся данные. Теперь хочу сделать функцию GetLibrary(@LibID int), которая вернула бы мне результат в виде:

ID Value
------------

где Value будет выбираться автоматически в зависимости от типа данных, который заведен для требуемой Library.

select
ID,
case DataType
when 0 then CharValue
when 1 then IntValue
when 2 then FloatValue
when 3 then DateTimeValue
else null
end as Value
from
Values
left join Library L on L.ID = Library_ID
where
Library_ID = @LibID


Но запрос не работает. Выдает ошибку: Syntax error converting datetime from character string. .

Можно ли построить запрос, который вернет мне нужный набор данных, который можно оформить в функцию?

Как можно еще решить такую задачу?


Sandman25   (2003-12-17 15:32:00) [1]

[7] AndrewK © (17.12.03 13:54)

Я предлагал ввести эти AsFloat на сервере, а не в клиентской части. Региональные настройки тогда не при чем.


AndrewK   (2003-12-17 14:02:00) [2]

>Hooch: Спасибо. Все получилось. Еще маленький вопрос - в EM можно править данное поле без использования SQL запросов?

>JibSkeart: В результирующем запросе однозначно остается только один тип. Это определяется полем @DataType таблицы Library. Вопрос был в том, как не объединять в одну колонку данные нескольких типов, а как в результирующем запросе брать нужный столбец и выдавать его в датасет в неизменном виде.


AndrewK   (2003-12-17 13:54:00) [3]

>Sandman25: Да все верно. Только при переводе чего-либо в строку сильное влияние оказывают региональные настройки. Не хочется от них зависеть.


JibSkeart   (2003-12-17 13:50:00) [4]

интерестно :))

а как ты в один столбец запихнещь данные одного типа ?

тоесть ты хочешь вывести

id Value
----------
1 aaa
2 bbb
3 ccc

где соответсвенно
ааа DateTime
bbb Int
ccc Char

не получится единственное
решение
это сделать как сказал Sandman25
а вот уже на клиенте конвертить


Sandman25   (2003-12-17 13:48:00) [5]

[4] AndrewK © (17.12.03 13:44)

Мне надо в результате получить набор столбцов не типа char(20), а набор столбцов типов int, char, float или datetime.

Зачем? Дальше ведь данные как-то будут использоваться, причем при этом использовании нужно заранее знать тип данных. Не лучше ли сделать аналог AsInt, AsChar, AsFloat?


AndrewK   (2003-12-17 13:44:00) [6]

> Sandman25: Мне надо в результате получить набор столбцов не типа char(20), а набор столбцов типов int, char, float или datetime. Case может быть здесь и не подходит.
>А зачем это нужно?:Надо сделать универсальную библиотечку, которая управлялась бы одними процедурами, имела стандартизированный вид и единый стиль работы с ней. Она должна хранить указанные типы значений.

>JibSkeart: Так и сделал. Как теперь с этим работать?


Hooch   (2003-12-17 13:36:00) [7]

sql_variant


JibSkeart   (2003-12-17 13:35:00) [8]

сделай несколько полей разных типов

integer int
dtime datetime
varchars varchar(50)
etc.


Sandman25   (2003-12-17 13:34:00) [9]

Насколько я понял, select пытается вернуть значение типа DatTime.
Насколько я знаю, выражения в case должны быть одного типа.
Попробуйте возвращать char(20):
case DataType
when 0 then cast(CharValue as char(20))
when 1 then cast(IntValue as char(20))
when 2 then cast(FloatValue as char(20))
when 3 then cast(DateTimeValue as char(20))
else cast(null as char(20))
end as Value

>Как можно еще решить такую задачу?

А зачем это нужно?


Наверх

Титульная страница Поиск, карта сайта Написать письмо