Управление иерархическими данными «ошибка: REPEAT 'не является распознанным именем встроенной функции». - PullRequest
3 голосов
/ 15 марта 2012

Я новичок в SQL. Я делаю исследование об управлении иерархическими данными с помощью MS SQL R2. Вот ссылка, где я ссылался http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ Но теперь у меня возникла проблема в Нахождении глубины узлов Копирую запрос sql в мою ms sql

SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM nested_category AS node, nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

Верните мне

Сообщение 195, уровень 15, состояние 10, строка 1 «REPEAT» не является распознанным именем встроенной функции.

Может кто-нибудь помочь мне исправить запрос sql?
Кроме того, кто-нибудь получил лучшее решение для управления иерархическими данными?

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Вы используете код из статьи MySQL о MS SQL Server.

Многое будет хорошо переводиться, но многое не будет. Как говорит @FilipDeVos, эквивалентом REPEAT() в SQL Server является REPLICATE(), и вы обнаружите еще много подобных случаев.

Когда вы их найдете, вам нужно искать в Интернете SQL Server, эквивалентный используемым операторам MySQL.


Что касается различных методов управления иерархиями, то наиболее распространенными являются, вероятно, adjaceny-lists, а затем nested-sets, которые вы используете в этой статье. Это зависит от ваших потребностей, продолжайте исследования, универсального золотого ответа не существует.

EDIT

Если вы продолжите читать эту статью и спросите здесь обо всех различиях, вы будете здесь навсегда. Вам нужно искать ответы в Интернете;)

Но сейчас, после того, как вы добавили вопрос о CONCAT(), попробуйте это ...

SELECT REPLICATE(' ', COUNT(parent.name) - 1) + node.name AS name 
1 голос
/ 15 марта 2012

SQL Server имеет синтаксис, отличный от mysql. Запрос можно переписать следующим образом

SELECT REPLICATE(' ', COUNT(parent.name) - 1) + node.name AS name
  FROM nested_category AS node
  JOIN nested_category AS parent
    ON node.lft BETWEEN parent.lft AND parent.rgt
 GROUP BY node.name
 ORDER BY node.lft;
  • Функция REPEAT() в MySQL может быть заменена функцией REPLICATE() в SQL Server.
  • Функция CONCAT() в MySQL не имеет аналога в SQL Server, но конкатенация строк может быть выполнена с помощью операнда +.
  • Объединение в SQL Server лучше написать с помощью конструкции INNER JOIN, так как оно более выразительное (хотя подход с запятой работает нормально).
1 голос
/ 15 марта 2012

Я думаю, что REPEAT - это команда mysql, и вы пометили MSSSQL, так что это, вероятно, не будет работать.

Для иерархических данных в Sql Server 2008 посмотрите тип данных HierarchyId.Я добавил ссылки на пару статей MSDN, которые должны указать вам правильное направление.

http://msdn.microsoft.com/en-us/library/bb677290.aspx

http://msdn.microsoft.com/en-us/magazine/cc794278.aspx

...