Преобразование типа данных Text к VARCHAR/NVARCHAR

1. ovadia 27.11.17 19:07 Сейчас в теме
Помогите, пожалуйста, исправить ошибку.

В БД поле f_label приведено к типу Text.

Делаю запрос:
a_label = "004";

	ТекстЗапроса = "SEL ECT * FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND f_label='"+a_label+"'";


При запросе к БД выдается ошибка:
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.


Как преобразовать Text к другому типу, чтобы корректно работал запрос?

Например, такой вариант не помогает:
ТекстЗапроса = "SEL ECT id, f_parent, CONVERT(varchar(max), f_label) FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND f_label='"+a_label+"'";
+
По теме из базы знаний
Найденные решения
13. spacecraft 27.11.17 20:29 Сейчас в теме
(10) сейчас попробовал. Вот так должно работать:
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, 8000) as label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";

или так:
ТекстЗапроса = "SEL ECT id, f_parent, f_label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 27.11.17 19:14 Сейчас в теме
(1) SUBSTRING ( expression ,start , length )
+
3. ovadia 27.11.17 19:17 Сейчас в теме
(2)
SUBSTRING ( expression ,start , length


Как эта функция выглядит в контексте запроса? Я думаю, что SUBSTRING вырезает кусок определенной длины из строки, а не преобразовывает тип данных. Вы можете написать запрос полностью? Причем тут SUBSTRING?
+
4. spacecraft 27.11.17 19:25 Сейчас в теме
(3) в sql нельзя преобразовать типы. Можно только взять подстроку. Как раз подстрока вырезает нужную длину из того же типа TEXT и получает VARCHAR определенной длины.
Это как в 1С строка неограниченной длины. Ее можно обработать в запросе только использую ПОДСТРОКА.
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING (f_label, 1, varchar(max)) FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND f_label='"+a_label+"'";
+
5. ovadia 27.11.17 19:30 Сейчас в теме
(4) Ваш вариант запроса не работает.
[Microsoft][ODBC SQL Server Driver][SQL Server]'varchar' is not a recognized function name.
+
7. spacecraft 27.11.17 19:35 Сейчас в теме
(5) псевдоним подстроки нужно указать.
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, varchar(max)) as label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND label='"+a_label+"'";
+
8. ovadia 27.11.17 19:40 Сейчас в теме
(7) Ошибка та же самая:
[Microsoft][ODBC SQL Server Driver][SQL Server]'varchar' is not a recognized function name.


MS SQL не знает такой функции varchar(). Нужно писать что то другое.
+
9. spacecraft 27.11.17 19:44 Сейчас в теме
(8) а если вместо varchar(max) подставить число 8000?
+
10. ovadia 27.11.17 19:55 Сейчас в теме
11. spacecraft 27.11.17 19:58 Сейчас в теме
(10) что, такая же ошибка?
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, 8000) as label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND label='"+a_label+"'";
Точно такой запрос?
+
13. spacecraft 27.11.17 20:29 Сейчас в теме
(10) сейчас попробовал. Вот так должно работать:
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, 8000) as label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";

или так:
ТекстЗапроса = "SEL ECT id, f_parent, f_label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";
+
17. ovadia 28.11.17 10:35 Сейчас в теме
(13) Первый вариант не работает.

А вот этот вполне:

ТекстЗапроса = "SEL ECT id, f_parent, f_label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";


Большое Вам спасибо!
+
18. spacecraft 28.11.17 10:38 Сейчас в теме
(17) все варианты из (13) и (14) проверены в mssql, Там все отрабатывают.
+
20. ovadia 28.11.17 10:41 Сейчас в теме
(13) Работает только второй вариант, почему то )
+
21. spacecraft 28.11.17 10:43 Сейчас в теме
(20) это может быть ограничение/проблема провайдера.
+
22. ovadia 28.11.17 10:46 Сейчас в теме
(13)
Для запроса:
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, 8000) as label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND SUBSTRING(f_label, 1, 8000)='"+a_label+"'";



Ошибка:
В коллекции не удается найти элемент, соответствующий требуемому имени или порядковому номеру.
+
23. spacecraft 28.11.17 10:48 Сейчас в теме
(22) это уже ошибка обработки далее. Тут же меняется имя выходящего поля: SUBSTRING(f_label, 1, 8000) as label
+
24. spacecraft 28.11.17 10:50 Сейчас в теме
(22) а из (14) не работает? Вроде лучший вариант должен быть.
+
25. ovadia 28.11.17 10:52 Сейчас в теме
(24) Из (14) ошибка: [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near 'max'.
+
26. spacecraft 28.11.17 10:53 Сейчас в теме
(25) тогда точно ограничение провайдера.
+
14. spacecraft 27.11.17 20:41 Сейчас в теме
(10) еще и так работает:
ТекстЗапроса = "SEL ECT id, f_parent, f_label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND CAST(f_label as varchar(max))='"+a_label+"'";
+
15. ovadia 28.11.17 10:32 Сейчас в теме
(14)
ТекстЗапроса = "SEL ECT id, f_parent, f_label FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND CAST(f_label as varchar(max))='"+a_label+"'";

(14) Ошибка:
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near 'max'.
+
16. spacecraft 28.11.17 10:35 Сейчас в теме
(15) в цитируемом варианте запроса нет max. Эта ошибка не отсюда.
+
19. ovadia 28.11.17 10:40 Сейчас в теме
(16) Исправил текст запроса.
+
12. Denis_CFO 48 27.11.17 20:16 Сейчас в теме
(1)
CONVERT(varchar(max), f_label)
вот так попробуй: CAST (f_label AS varchar (25))
+
6. ovadia 27.11.17 19:33 Сейчас в теме
Такой вариант тоже не рабочий:
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, Datalength(f_label)) FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND f_label='"+a_label+"'";


И такой:
ТекстЗапроса = "SEL ECT id, f_parent, SUBSTRING(f_label, 1, LEN(f_label)) FR OM "+ТаблицаSQL_Enum+" WHERE f_parent='"+a_parent+"' AND f_label='"+a_label+"'";
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот