Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Как хранить в таблице значения разных типов   Найти похожие ветки 

 
AndrewK ©   (2003-12-17 13:29) [0]

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

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

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

Сделал таблицу
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 13:34) [1]

Насколько я понял, 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

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

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


 
JibSkeart ©   (2003-12-17 13:35) [2]

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

integer int
dtime datetime
varchars varchar(50)
etc.


 
Hooch ©   (2003-12-17 13:36) [3]

sql_variant


 
AndrewK ©   (2003-12-17 13:44) [4]

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

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


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

[4] AndrewK © (17.12.03 13:44)

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

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


 
JibSkeart ©   (2003-12-17 13:50) [6]

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

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

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

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

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

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


 
AndrewK ©   (2003-12-17 13:54) [7]

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


 
AndrewK ©   (2003-12-17 14:02) [8]

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

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


 
Sandman25 ©   (2003-12-17 15:32) [9]

[7] AndrewK © (17.12.03 13:54)

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



Страницы: 1 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
1-37751
npAKTuk
2003-12-29 20:58
2004.01.13
Запись переменной структуры в начало файла


14-37928
Agent[007]
2003-12-20 16:55
2004.01.13
СРОЧНО! У МЕНЯ 22 ДЕКАБРЯ ЭКЗАМЕН ПО ГЕОМЕТРИИ!


1-37696
Eugene
2003-12-26 02:34
2004.01.13
Update


1-37761
Alexander_spb
2003-12-29 20:07
2004.01.13
TCanvas


4-37976
dar
2003-11-10 09:52
2004.01.13
Раскладка клавиатуры