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

Откуда:
Сообщений: 8
Всем доброго дня!

Заранее прошу не пинать (в темен полный ноль) а помочь.

Есть некая программа, которая после переноса базы с sql 2008 в sql 2017 при формировании отчета (Fast Reports) выдает ошибку - Неправильный синтаксис *=

Нашел запрос который видимо ее вызывает:

From question,persona, address,sp_organization,sp_area
Where question.persona_id = persona.id and
persona.address_ID = address.ID AND
question.korr_code = sp_organization.code and
address.area_code *= sp_area.code and
question.date_reg >= :date and
question.date_reg<= :date1 and
question.date_do >= :date2 and
question.date_do <= :date3

Видимо беда в этом:
Ссылка

Ребят помогите переделать данный запрос.

Заранее, Спасибо!
18 мар 19, 10:19    [21835637]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

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

*= в WHERE асолютно запрещено ещё в SQL2005!

Необходимо просканировать все объекты в поисках *= и =*
и заменить на LEFT JOIN и RIGHT JOIN соответственно во FROMе.

С удовольствием вспоминаю, как я этим занимался целую неделю в 2005 году!

Выполните:
SELECT type,name
FROM sys.objects
WHERE OBJECT_DEFINITION(object_id) LIKE N'%*=%'
   OR OBJECT_DEFINITION(object_id) LIKE N'%=*%';
18 мар 19, 10:30    [21835645]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Забыл сказать!
Первым делом надо выбросить запятые из FROM. И переписать, используя разные виды JOIN.
18 мар 19, 10:32    [21835650]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
iap
Забыл сказать!
Первым делом надо выбросить запятые из FROM. И переписать, используя разные виды JOIN.
Ни в коем случае не смешивайте JOINы и запятые в одном и том же FROM!
18 мар 19, 10:33    [21835651]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

Откуда:
Сообщений: 8
Прошу прощения, тяжело понять(((

Вот весь код:

Select question.id, persona.fm,persona.im,persona.ot, question.date_reg,question.result_body, question.korr_num,
dbo.GetGpNumPersona(question.persona_id,question.curyear) as gp, persona.email,
question.date_reg,question.num,question.curyear,question.question_body,sp_organization.name,sp_area.name,
isnull(case
when rtrim(address.postindex)<>'' then rtrim(address.postindex)+', '
else ''
end,'')+
isnull((select sp_oksmt.krnaim from sp_oksmt where sp_oksmt.kod=address.country_code),'')+', '+
isnull(case
when not address.subject_code is null then
(select sp_kladrw_name.name+' '+sp_socr.name+', ' from sp_kladrw_name,sp_kladrw,sp_socr
where sp_kladrw.code=address.subject_code and
sp_kladrw.socr_code = sp_socr.code and
sp_kladrw.name_code = sp_kladrw_name.code)
end,'')+
isnull(case
when not address.raion_code is null then
(select sp_kladrw_name.name+' '+sp_socr.name+', ' from sp_kladrw_name,sp_kladrw,sp_socr
where sp_kladrw.code=address.raion_code and
sp_kladrw.socr_code = sp_socr.code and
sp_kladrw.name_code = sp_kladrw_name.code)
end,'')+
isnull(case
when not address.city_code is null then
(select sp_socr.name+' '+sp_kladrw_name.name+', ' from sp_kladrw_name,sp_kladrw,sp_socr
where sp_kladrw.code=address.city_code and
sp_kladrw.socr_code = sp_socr.code and
sp_kladrw.name_code = sp_kladrw_name.code)
end,'')+
isnull(case
when not address.settlement_code is null then
(select sp_socr.name+' '+sp_kladrw_name.name+', ' from sp_kladrw_name,sp_kladrw,sp_socr
where sp_kladrw.code=address.settlement_code and
sp_kladrw.socr_code = sp_socr.code and
sp_kladrw.name_code = sp_kladrw_name.code)
end,'')+
isnull(case
when not address.street_code is null then
(select sp_socr.name+' '+sp_streetw_name.name+', ' from sp_streetw_name,sp_streetw,sp_socr
where sp_streetw.code=address.street_code and
sp_streetw.socr_code = sp_socr.code and
sp_streetw.name_code = sp_streetw_name.code)
end,'')+
isnull(case
when address.dom<>'' then +rtrim(address.dom)
else ''
end,'')+
isnull(case
when address.kor<>'' then '/'+rtrim(address.kor)
else ''
end,'')+
isnull(case
when address.kvr<>'' then ', кв.'+rtrim(address.kvr)
else ''
end,'') as addr
From question,persona, address,sp_organization,sp_area
Where question.persona_id = persona.id and
persona.address_ID = address.ID AND
question.korr_code = sp_organization.code and
address.area_code *= sp_area.code and
question.date_reg >= :date and
question.date_reg<= :date1 and
question.date_do >= :date2 and
question.date_do <= :date3
18 мар 19, 10:39    [21835654]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

Откуда:
Сообщений: 8
Парни ноль в этом, помогите поправить
18 мар 19, 10:40    [21835656]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
faensi
Парни ноль в этом, помогите поправить


FROM question q
JOIN persona p ON q.persona_id=p.id
JOIN address a ON p.address_ID=a.id
JOIN sp_organization o ON q.korr_code=o.code
LEFT JOIN sp_area r ON a.area_code=r.code
WHERE q.date_reg BETWEEN :date AND :date1
  AND q.date_do BETWEEN :date2 AND :date3;
18 мар 19, 10:56    [21835676]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

Откуда:
Сообщений: 8
iap
faensi
Парни ноль в этом, помогите поправить


FROM question q
JOIN persona p ON q.persona_id=p.id
JOIN address a ON p.address_ID=a.id
JOIN sp_organization o ON q.korr_code=o.code
LEFT JOIN sp_area r ON a.area_code=r.code
WHERE q.date_reg BETWEEN :date AND :date1
  AND q.date_do BETWEEN :date2 AND :date3;


К сожалению теперь ошибка:

Не удалось привязать составной идентификатор "question.id"
18 мар 19, 11:04    [21835683]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

Откуда:
Сообщений: 8
Если запрос сделать вида:

FROM question
JOIN persona ON question.persona_id = persona.id
JOIN address ON persona.address_ID = address.ID
JOIN sp_organization ON question.korr_code = sp_organization.code
LEFT OUTER JOIN sp_area ON address.area_code = sp_area.code
WHERE question.date_reg BETWEEN :date AND :date1 AND question.date_do BETWEEN :date2 AND :date3

Запрос отрабатывает, но корректно ли это? не приведет ли к другим проблемам такое исполнение?
18 мар 19, 12:46    [21835816]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
Владислав Колосов
Member

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

btw синтаксис join также является устаревшим (сейчас используется указание inner join). На первый взгляд всё верно.
18 мар 19, 13:07    [21835854]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Владислав Колосов
faensi,

btw синтаксис join также является устаревшим (сейчас используется указание inner join). На первый взгляд всё верно.

сами придумали ли где документ есть?
18 мар 19, 13:12    [21835867]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Владислав Колосов
faensi,

btw синтаксис join также является устаревшим (сейчас используется указание inner join). На первый взгляд всё верно.
Чо за фигня?
18 мар 19, 13:36    [21835910]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
faensi
iap
пропущено...


FROM question q
JOIN persona p ON q.persona_id=p.id
JOIN address a ON p.address_ID=a.id
JOIN sp_organization o ON q.korr_code=o.code
LEFT JOIN sp_area r ON a.area_code=r.code
WHERE q.date_reg BETWEEN :date AND :date1
  AND q.date_do BETWEEN :date2 AND :date3;



К сожалению теперь ошибка:

Не удалось привязать составной идентификатор "question.id"
Заметьте: поля question.id я даже не писал! Зато скопипастил у вас question.persona_id
18 мар 19, 13:39    [21835914]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
iap
Владислав Колосов
faensi,

btw синтаксис join также является устаревшим (сейчас используется указание inner join). На первый взгляд всё верно.
Чо за фигня?
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/from-transact-sql?view=sql-server-2017
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
У меня просто пока нет ссылки на более новый официальный Help. 2017 - уже устарело?
18 мар 19, 13:47    [21835926]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

Откуда:
Сообщений: 8
Всем спасибо!!!!! Вроде все формирует как и требовалось.
18 мар 19, 14:19    [21835971]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
Владислав Колосов
Member

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

встречал где-то... У меня память не энциклопедическая. В любом случае, bеst practices писать однотипно.

TOP 1 также устаревшее, из этой же категории, надо писать TOP (1) в modern стиле.
18 мар 19, 14:52    [21836043]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Владислав Колосов
iap,

встречал где-то... У меня память не энциклопедическая. В любом случае, bеst practices писать однотипно.

TOP 1 также устаревшее, из этой же категории, надо писать TOP (1) в modern стиле.

если разбавить фантазию ложкой правды, это всё оправдает...
18 мар 19, 15:01    [21836062]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

Откуда: Москва
Сообщений: 46981
Владислав Колосов
iap,

встречал где-то... У меня память не энциклопедическая. В любом случае, bеst practices писать однотипно.

TOP 1 также устаревшее, из этой же категории, надо писать TOP (1) в modern стиле.
Про TOP уже давно было официально объявлено. Как и про точку с запятой.
А так дело вкуса... Писать INNER или OUTER или не писать? Писать AS в объявлении алиаса или нет?
Надо ставить FROM перед именем таблицы в DELETE или нет? То же самое - с INTO в INSERTе и MERGE.
Я, например, никогда не пишу лишнего.
18 мар 19, 15:25    [21836104]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

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

Прошу (аналогичной) вашей помощи, не удается правильно расписать:

from persona p,question q,address,sp_clerk sc,
sp_resulttype sr,filter f
where q.id=f.id and
f.name=:name and
q.persona_id=p.id and
p.address_id=address.id and
q.kurator_code*=sc.code and
q.result_code*=sr.code
order by f.sort

Спасибо!
18 мар 19, 17:35    [21836317]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
Владислав Колосов
Member

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

да, Вы правы, INNER является вспомогательным словом. Вопрос личных предпочтений и внутренних стандартов.
18 мар 19, 17:39    [21836328]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
faensi
Member

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

Прошу (аналогичной) вашей помощи, не удается правильно расписать:

from persona p,question q,address,sp_clerk sc,
sp_resulttype sr,filter f
where q.id=f.id and
f.name=:name and
q.persona_id=p.id and
p.address_id=address.id and
q.kurator_code*=sc.code and
q.result_code*=sr.code
order by f.sort

Спасибо!


Парни может кто еще знает как переписать данный запрос, просим помогите поправить
21 мар 19, 08:41    [21839112]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис *=  [new]
iap
Member

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

Прошу (аналогичной) вашей помощи, не удается правильно расписать:

from persona p,question q,address,sp_clerk sc,
sp_resulttype sr,filter f
where q.id=f.id and
f.name=:name and
q.persona_id=p.id and
p.address_id=address.id and
q.kurator_code*=sc.code and
q.result_code*=sr.code
order by f.sort

Спасибо!


Парни может кто еще знает как переписать данный запрос, просим помогите поправить
Но это же простая механическая задача. Тут даже головной мозг не нужен!
Для таблиц, которые связываются условиями без звёздочек, запятую между ними заменяем на JOIN,
а условия полей для этих таблиц записываем в ON.
Если поля таблиц связываются оператором *=, то пишем LEFT JOIN, если =*, - RIGHT JOIN, если *=* - FULL JOIN.
В ON записываем условия связи между соответствующими таблицами.
Нельзя писать условия в WHERE для правой таблицы LEFT JOIN и для левой таблицы RIGHT JOIN.
21 мар 19, 10:20    [21839216]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить