Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Не могу понять, как написать скрипт, помогите.

Есть таблица TBL_1
CL_11CL_12
1AAA
2BBB
3CCC
4DDD

CL_11 - int
CL_12 - varchar

и таблица TBL_2
CL_21CL_22
DATA1 ,1,2,
DATA2 ,3,4,
DATA3 ,2,3,
DATA3 ,1,4,

CL_21 - varchar
CL_22 - nvarchar

Условие: необходимо выбрать из таблицы TBL_2 те записи для которых в поле CL_22 есть ID'шник(и) (CL_11) из таблицы TBL_1 выбранные по полю CL_12


Такой скрипт:
select CL_21 from TBL_2
where exists(
	select 1 from TBL_1
	where TBL_1.CL_12 in ('AAA','BBB')
	and TBL_2.CL_22 LIKE ','+CAST(TBL_1.CL_11 AS VARCHAR(500))+','
)

Возвращает ошибку:
Msg 306, Level 16, State 2, Line 1
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Хотя предпологалось, что должно вывестись:
CL_21
DATA1
DATA2
DATA3


При этом если вместо столбца в условии
and TBL_2.CL_22 LIKE ','+CAST(TBL_1.CL_11 AS VARCHAR(500))+','

вбить константу типа int
and TBL_2.CL_22 LIKE ','+CAST(2 AS VARCHAR(500))+','

всё отрабатывает без ошибки.

Подскажите в чём может быть дело или эту задачу можно решить другим способом?
17 мар 16, 16:12    [18944135]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
seivgard

Подскажите в чём может быть дело


The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator
17 мар 16, 16:15    [18944156]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
А почему тогда успешно отрабатывает такой вариант?

select CL_21 from TBL_2
where exists(
	select 1 from TBL_1
	where TBL_1.CL_12 in ('AAA','BBB')
	and TBL_2.CL_22 LIKE ','+CAST(2 AS VARCHAR(500))+','
)
17 мар 16, 16:17    [18944165]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
Подскажите в чём может быть дело

Наверное вы ошибаетесь насчет типов полей
17 мар 16, 16:18    [18944167]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
seivgard,

трудно разве получить скрипты CREATE TABLE для ваших таблиц и выложить их здесь?
17 мар 16, 16:19    [18944179]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
iap,

CREATE TABLE TBL_1(
 CL_11 INTEGER,
 CL_12 VARCHAR(255)
)
GO
INSERT INTO TBL_1(CL_11, CL_12)
VALUES (1, 'AAA'),(2, 'BBB'),(3, 'CCC'),(4, 'DDD')
GO



CREATE TABLE TBL_2(
 CL_21 VARCHAR(255),
 CL_22 NVARCHAR(255)
)
GO
INSERT INTO TBL_2(CL_21, CL_22)
VALUES ('DATA1',',1,2,'),('DATA2',',3,4,'),('DATA3',',2,3,'),('DATA4',',1,4,')
GO


Хотя есть подозрения, что столбец CL_22 имеет тип longvarchar.
К сожалению не имею доступа непосредственно к БД, могу только запрашивать данные и получать результат в виде выборка/ошибка.
17 мар 16, 16:42    [18944353]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
Хотя есть подозрения, что столбец CL_22 имеет тип longvarchar.

В MSSQL нет такого типа данных

seivgard
К сожалению не имею доступа непосредственно к БД, могу только запрашивать данные и получать результат в виде выборка/ошибка.

А как вам удается без доступа к БД "запрашивать данные и получать результаты" ?
17 мар 16, 16:43    [18944362]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Glory
seivgard
Хотя есть подозрения, что столбец CL_22 имеет тип longvarchar.

В MSSQL нет такого типа данных

seivgard
К сожалению не имею доступа непосредственно к БД, могу только запрашивать данные и получать результат в виде выборка/ошибка.

А как вам удается без доступа к БД "запрашивать данные и получать результаты" ?

почтой :)
17 мар 16, 16:54    [18944418]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Glory,

Glory
В MSSQL нет такого типа данных

тип данных ntext

Glory
А как вам удается без доступа к БД "запрашивать данные и получать результаты" ?

Есть корпоративный треккер, для построения отчётов можно использовать конструктор условий, но им не задать более менее сложных ограничений, а есть возможность использовать условие в формате SQL указывая условия для where с обращением к таблицам, к которым по другому не достучаться.

Так что задача довольная "весёлая" составить выборку имея только приблизительное предстовление о модели БД и довольно посредственные навыки в использовании MS SQL (познания в Oracle SQL помогают так себе)
17 мар 16, 16:58    [18944452]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
тип данных ntext

Что тогда вам непонятно в сообщении
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
?

seivgard
Есть корпоративный треккер, для построения отчётов можно использовать конструктор условий, но им не задать более менее сложных ограничений, а есть возможность использовать условие в формате SQL указывая условия для where с обращением к таблицам, к которым по другому не достучаться.

Информацию о метаданных можно и select-ами получать
17 мар 16, 17:03    [18944480]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Glory,

Glory
Что тогда вам непонятно в сообщении
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
?


В сообщении всё понятно, нельзя использовать like для ntext, но не понятно почему тогда отрабатывает условие?:
and TBL_2.CL_22 LIKE ','+CAST(2 AS VARCHAR(500))+','

Хотя это тоже like для ntext

и не отрабатывает условие?:
and CAST(TBL_2.CL_22 AS NVARCHAR(500)) LIKE ','+CAST(2 AS VARCHAR(500))+','

Хотя ntext кастится в другой тип
17 мар 16, 17:12    [18944558]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
Хотя ntext кастится в другой тип

SQL - это декларативный язык.
Вы пишите, что вы хотите получить, а не каким спосбом сервер должен это получить
17 мар 16, 17:15    [18944568]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Поправка:


и не отрабатывает условие?:
and CAST(TBL_2.CL_22 AS NVARCHAR(500)) LIKE ','+CAST(TBL_1.CL_11 AS VARCHAR(500))+','

Хотя ntext кастится в другой тип
17 мар 16, 17:16    [18944575]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Glory,

Glory
SQL - это декларативный язык.
Вы пишите, что вы хотите получить, а не каким спосбом сервер должен это получить


Спасибо, конечно.

Но это знание, к сожалнию, не приближет меня к решению изначальной задачи:
seivgard
необходимо выбрать из таблицы TBL_2 те записи для которых в поле CL_22 есть ID'шник(и) (CL_11) из таблицы TBL_1 выбранные по полю CL_12


Возможно, есть решение без использования exists или кастинга типов, если можете подсказать буду благодарен.
17 мар 16, 17:21    [18944601]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
Но это знание, к сожалнию, не приближет меня к решению изначальной задачи:

Так и не приблизит, если вы по прежнему будете делать like над запрещенными типами полей
17 мар 16, 17:23    [18944615]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
seivgard
, но не понятно почему тогда отрабатывает условие?:

LIKE ','+CAST(2 AS VARCHAR(500))+','

потому что в лайк вы НЕ нтекст передаете
17 мар 16, 18:03    [18944836]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
seivgard
В сообщении всё понятно, нельзя использовать like для ntext, но не понятно почему тогда отрабатывает условие?:


вообще-то, там ровно обратное написано. только с помощью like или is null и можно ntext сравнивать.
17 мар 16, 18:48    [18945010]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
seivgard
В сообщении всё понятно, нельзя использовать like для ntext
Как раз-таки, наоборот!
Только LIKE и можно.
Как вы переводите слово EXCEPT?
17 мар 16, 19:15    [18945108]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
iap,

iap
Только LIKE и можно.

Действительно, не внимательно прочитал. Но почему тогда не работает?
17 мар 16, 19:33    [18945155]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
seivgard
iap,

iap
Только LIKE и можно.

Действительно, не внимательно прочитал. Но почему тогда не работает?
Наверно, TBL_1.CL_12 неправильного типа.
Но от вас ничего не добьёшься...
17 мар 16, 20:01    [18945229]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
o-o
Guest
скорее всего, здесь CL_21 text/ntext.
первый запрос со столбцом наверное содержит еще и order by CL_21,
а со вбитой константой может, order by потерялся?
только в любом случае запрос ничего не вернет,
потому что в нем потеряны %:
select CL_21 from TBL_2
where exists(
	select 1 from TBL_1
	where TBL_1.CL_12 in ('AAA','BBB')
	and TBL_2.CL_22 LIKE '%,'+CAST(TBL_1.CL_11 AS VARCHAR(500))+',%'
)
17 мар 16, 23:57    [18946029]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
iap
Наверно, TBL_1.CL_12 неправильного типа.


Не похоже, скрипт:
select CL_21 from TBL_2
where exists(
	select 1 from TBL_1
	where TBL_1.CL_12 in ('AAA','BBB')
)

Отрабатывает без ошибки. Возвращает, конечно, не то что нужно, но это показывает что с типом поля CL_12 всё хорошо.

А скрипт:
select CL_21 from TBL_2
where exists(
	select 1 from TBL_1
	where TBL_1.CL_12 in ('AAA','BBB')
	and TBL_2.CL_22 LIKE '%,'+CAST(TBL_1.CL_11 AS VARCHAR(500))+',%'
)

Возвращает ошибку, о том, что text/ntext можно сравнивать только LIKE'ом, хотя сравнение и так идёт LIKE'ом...

Вобщем по формату полей узнал точно:
TBL_1.CL_11 - int
TBL_1.CL_12 - varchar

TBL_2.CL_21 - varchar
TBL_2.CL_22 - text
18 мар 16, 10:58    [18946922]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
Glory
Member

Откуда:
Сообщений: 104760
seivgard
Возвращает ошибку, о том, что text/ntext можно сравнивать только LIKE'ом, хотя сравнение и так идёт LIKE'ом...

Еще раз
Ошибка говорит о том, что в запросе была попытка осуществить сортировку или сравнение (compared or sorted) полей с типом данных text, ntext, and image
18 мар 16, 11:04    [18946955]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
INT, преобразованный в VARCHAR(...), не может занимать более 11 символов.
Так что VARCHAR(500) тоже выглядит странно...
18 мар 16, 11:09    [18946980]     Ответить | Цитировать Сообщить модератору
 Re: Help! Msg 306 при использовании exists  [new]
seivgard
Member

Откуда:
Сообщений: 13
Glory
Ошибка говорит о том, что в запросе была попытка осуществить сортировку или сравнение (compared or sorted) полей с типом данных text, ntext, and image


Сортировки в запросе нет.

Два запроса отличаются только наличием условия:
and TBL_2.CL_22 LIKE '%,'+CAST(TBL_1.CL_11 AS VARCHAR(500))+',%'


Если условие есть, то ошибка, если нет, то корректно отрабатывает.



iap
INT, преобразованный в VARCHAR(...), не может занимать более 11 символов.
Так что VARCHAR(500) тоже выглядит странно...


Поменял на
and TBL_2.CL_22 LIKE '%,'+CAST(TBL_1.CL_11 AS VARCHAR(10))+',%'

Результат не изменился, всё то же "...cannot be compared or sorted..."
18 мар 16, 11:16    [18947015]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить