Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
7-37951
MakNik
2003-10-30 15:52
2004.01.13
Сервисы


6-37821
inc-vizitor
2003-10-22 22:39
2004.01.13
mailslots, названия каналов


14-37876
}|{yk
2003-12-23 18:38
2004.01.13
Никто не видел сервера ICQ для локальной сети?


14-37911
Tuzemec
2003-12-18 06:17
2004.01.13
Ищу пример базы для курсового проекта.


1-37699
MadAngel
2003-12-25 23:43
2004.01.13
TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский