Текущий архив: 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.46 MB
Время: 0.009 c