Что эквивалентно SQL Server 2016 при использовании функций group_contact () и locate ()? - PullRequest
0 голосов
/ 08 апреля 2020

А пока go, я спросил: " Как мне создать" хлебную крошку "категорий в чистом MySQL? ", которую один из членов stackoverflow предоставил этот аккуратный код для моих потребностей MySQL :

select group_concat(t2.name order by locate(concat('/', t2.id, '/'), concat(t1.path, '/')) separator ' - ') breadcrumb
from mdl_course_categories t1, 
     mdl_course_categories t2
where locate(concat('/', t2.id, '/'), concat(t1.path, '/'))

Сегодня я нахожу, что мне нужно решение SQL Server 2016 для этой комбинации функций (group_concat() и locate()) для репликации этой функции. Я попытался запустить этот код для этой базы данных, но вместо этого я получил сообщение об ошибке:

SQLState: 42000

Error Code: 156

Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near the keyword 'order'.

Я проверил другие вопросы , но не смог перевести это знание для моих нужд. Как я могу воспроизвести эту функцию в SQL Server 2016?

Редактировать: я прочитал ссылки, предоставленные @Bacon Bits (спасибо!), Но сделать это в SQL Server 2016 представляется как программирование кусочка сыра для полета на Луну. К сожалению, обновление не вариант, поэтому я застрял в этом горячем беспорядке. Все, что мне нужно сделать, это заменить числа в столбце path на name согласно id. Например,

| id      | name          | path              | should display as              |
|---------|---------------|-------------------|--------------------------------|
| 1       | Fruit and Veg | /1                | Fruit and Veg - Fruit          |
| 436547  | Fruit         | /1/436547         | Fruit and Veg - Fruit          |
| 4657598 | Apples        | /1/436547/4657598 | Fruit and Veg - Fruit - Apples |

ТАК ЧУВСТВИТЕЛЬНО! Вот мой код:

select 
    stuff((',' + t2.name), 1, 1, charindex(concat('/', t2.id, '/'), concat(t1.path, '/')))   
from prefix_course_categories t1, 
     prefix_course_categories t2
where charindex(concat('/', t2.id, '/'), concat(t1.path, '/'))

Это приводит к следующей ошибке:

SQLState: 42000

Error Code: 4145

Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]An expression of non-boolean type specified in a context where a condition is expected, near 'ORDER'.

Помощь оценена, спасибо.

1 Ответ

2 голосов
/ 08 апреля 2020

GROUP_CONCAT() не имеет хорошего эквивалента в MS SQL Server до SQL Server 2017, когда введена функция STRING_AGG() . SQL Server 2016 и более ранние версии могут имитировать его с помощью метода STUFF FOR XML PATH , который является загадочным, неприятным, раздражающим и имеет ловушки, в которых вы можете иметь XML сущности на выходе, если вы этого не сделаете назовите это как раз правильно. Но в целом он работает довольно хорошо.

MySQL s LOCATE() примерно эквивалентно CHARINDEX(), я думаю. Также есть функция PATINDEX() , которая немного более гибкая, но не так хорошо работает.

...