![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как хранить в таблице значения разных типов [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
>Как можно еще решить такую задачу?
А зачем это нужно?