Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблемы с типом SQL_VARIANT  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
День добрый!
"По наследству" досталась таблица ("труба") tableData с полем типа SQL_VARIANT. В данном поле VDATA хранятся разнородные данные (целые и дробные числа [в т.ч. с запятой в качестве разделителя дробной и целой частей], текстовые фрагменты). При запросе
SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = '[Некоторое целое число, например: 100, 200, 10000 и т.д]';

работает нормально и возвращает требуемые данные. Но запрос
SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = '[Некоторое дробное число через запятую, например: 123,45 или 6857,598]';

возвращает пустой результат, хотя указанные числа точно существуют в БД.

Я пробовал все возможные варианты CAST и CONVERT как по полю VDATA, так и относительно искомого значения... безрезультатно.

Может кто-нибудь подсказать, в чем проблема?
24 мар 15, 13:05    [17424237]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
demoniqus
День добрый!
"По наследству" досталась таблица ("труба") tableData с полем типа SQL_VARIANT. В данном поле VDATA хранятся разнородные данные (целые и дробные числа [в т.ч. с запятой в качестве разделителя дробной и целой частей], текстовые фрагменты). При запросе
SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = '[Некоторое целое число, например: 100, 200, 10000 и т.д]';

работает нормально и возвращает требуемые данные. Но запрос
SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = '[Некоторое дробное число через запятую, например: 123,45 или 6857,598]';

возвращает пустой результат, хотя указанные числа точно существуют в БД.

Я пробовал все возможные варианты CAST и CONVERT как по полю VDATA, так и относительно искомого значения... безрезультатно.

Может кто-нибудь подсказать, в чем проблема?



а так

SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = '[Некоторое дробное число через [s]запятую[/s] ТОЧКУ, например: 123.45 или 6857.598]';
24 мар 15, 13:08    [17424254]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
А хитрить не надо, Winnipuh )))))))))
Дробные числа в БД записаны с запятой в качестве разделителя и фактически представляют из себя неконвертируемую строку. И изменить это нельзя. Так что вариант с 123.45 не прокатывает...
24 мар 15, 13:11    [17424275]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
demoniqus
А хитрить не надо, Winnipuh )))))))))
Дробные числа в БД записаны с запятой в качестве разделителя и фактически представляют из себя неконвертируемую строку. И изменить это нельзя. Так что вариант с 123.45 не прокатывает...


уже и спросить нельзя
24 мар 15, 13:12    [17424279]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
В юникодных литеральных строках надо спереди прибавлять N
N'[Некоторое дробное число через запятую, например: 123,45 или 6857,598]';
24 мар 15, 13:13    [17424285]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
а так?
SELECT * FROM tableData WHERE CONVERT(NVARCHAR(MAX), VDATA) = N'[Некоторое дробное число через запятую, например: 123,45 или 6857,598]';
24 мар 15, 13:13    [17424286]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
С N'...' тоже не прокатывает ((((
Кстати, Winnipuh, хитрость на самом деле сработала. Я для пробы подправил в одном значении запятую на точку и запрос сработал.
24 мар 15, 13:16    [17424309]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
Попробовал вкатить кириллицу - запрос по прежнему работает... даже при наличии запятых ...
24 мар 15, 13:19    [17424329]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
o-o
Guest
я чего-то не понимаю или в чем проблема?
declare @t table(id int, val SQL_VARIANT);
insert into @t values(1, '123,45'), (2, '123,456');

SELECT * FROM @t WHERE CONVERT(NVARCHAR(MAX), val) = '123,45';
---
id	val
1	123,45
24 мар 15, 13:22    [17424345]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
demoniqus
Кстати, Winnipuh, хитрость на самом деле сработала.
Нет никакой хитрости.
Ваши "Дробные числа в БД записаны с запятой в качестве разделителя и фактически представляют из себя неконвертируемую строку" на самом деле значения типа money. Которые, при конвертации в строку, в качестве разделителя получают точку.
24 мар 15, 13:24    [17424367]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
demoniqus,
1) Посмотрите, что за тип внутри конкретного значения с запятой.
https://msdn.microsoft.com/en-us/library/ms178550.aspx
2) Конвертировать надо не значение в таблице, а значение, которое вы подставляете.

Т.е.

SELECT * 
FROM tableData 
WHERE VDATA = convert('[Тип данных, который получили на первом шаге]'
                   , '[Некоторое дробное число через запятую, например: 123,45 или 6857,598]');
24 мар 15, 13:45    [17424580]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
Minamoto, я тоже нашел этот SQL_VARIANT_PROPERTY и он частично является ответом на мой вопрос))) Сейчас буду мудрить.

Еще нашел такую фишку - при конвертировании большого float-значения, оно было изменено на экспоненциальную форму, из-за чего и не проходит валидация равенства, т.к. сравниваются уже строки... не прокатил вариант "сравнить все, как строки".
24 мар 15, 13:55    [17424651]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с типом SQL_VARIANT  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
demoniqus
Еще нашел такую фишку - при конвертировании большого float-значения, оно было изменено на экспоненциальную форму, из-за чего и не проходит валидация равенства, т.к. сравниваются уже строки... не прокатил вариант "сравнить все, как строки".

И это еще один повод, почему надо входную строку приводить к конкретному типу, а не колонку SQL_VARIANT к nvarchar(max) ;)
24 мар 15, 14:12    [17424825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить