管理分层数据“错误:REPEAT'不是公认的内置函数名称。”

时间:2012-03-15 08:20:10

标签: sql sql-server-2008 hierarchical-data

我是SQL的初学者。我正在研究如何使用ms sql r2 2008管理分层数据。这是我提到的链接 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;

它回报我

  

Msg 195,Level 15,State 10,Line 1'REPEAT'不是公认的内置函数名。

有人可以帮我纠正sql查询吗? 另外,任何人都有更好的管理分层数据的解决方案吗?

3 个答案:

答案 0 :(得分:2)

您使用MS SQL Server上的MySQL文章中的代码。

很多人会很好地翻译,但很多人都不会。正如@FilipDeVos所说,SQL Server中REPEAT()的等效值为REPLICATE(),你会发现更多像这样的情况。

当您找到它们时,您需要在线搜索与您正在使用的MySQL语句等效的SQL Server。


对于管理层次结构的不同方法,最常见的可能是adjaceny-lists,然后是你在该文章中使用的嵌套集。这取决于你的需求,继续研究,没有普遍的回答。

修改

如果你继续阅读那篇文章,并在这里询问每一个差异,你将永远在这里。您需要在网上搜索您的答案;)

但是,就目前而言,在您添加有关CONCAT()的问题后,请尝试此操作...

SELECT REPLICATE(' ', COUNT(parent.name) - 1) + node.name AS name 

答案 1 :(得分:1)

我认为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

答案 2 :(得分:1)

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;
  • MySQL中的REPEAT()函数可以替换为SQL Server中的REPLICATE()函数。
  • MySQL中的CONCAT()函数在SQL Server中没有对应函数,但字符串连接可以通过使用+操作数来完成。
  • 使用INNER JOIN构造可以更好地编写SQL Server中的连接,因为它更具表现力(尽管使用逗号的方法确实可以正常工作)。