Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL命令在实现递归时未正确结束错误_Sql_Sql Server - Fatal编程技术网

SQL命令在实现递归时未正确结束错误

SQL命令在实现递归时未正确结束错误,sql,sql-server,Sql,Sql Server,当我运行上述代码时,我得到错误语句SQL命令没有正确结束。请指导我。您的问题很好。是RexTester中几乎完全相同查询的一个示例 如果您得到一个错误,那么在这个代码之前可能有代码。这将导致错误。使用分号可以防止以后的代码出现问题 首先,递归子句应该显式列出列。不要使用select*和select,并期望两者匹配。因此,请列出以下列: WITH TBL AS ( SELECT * FROM OUTPUT WHERE PRODUCT_ID = 5 UNION ALL SELECT

当我运行上述代码时,我得到错误语句SQL命令没有正确结束。请指导我。

您的问题很好。是RexTester中几乎完全相同查询的一个示例

如果您得到一个错误,那么在这个代码之前可能有代码。这将导致错误。使用分号可以防止以后的代码出现问题

首先,递归子句应该显式列出列。不要使用select*和select,并期望两者匹配。因此,请列出以下列:

WITH TBL AS
(
   SELECT * FROM OUTPUT WHERE PRODUCT_ID = 5
   UNION ALL
   SELECT O.PRODUCT_ID,O.PRODUCT_NAME,O.PARENT_ID,O.PARENT_PRODUCT_NAME 
   FROM OUTPUT O
   JOIN TBL T1 ON O.PRODUCT_ID = T1.PARENT_ID
)
SELECT * FROM TBL
WHERE PRODUCT_ID <> 5
OPTION(MAXRECURSION 1000);
第二,您的名字中不应该有父产品名称。您有父ID。请使用该ID查找名称。

您的查询没有问题。是RexTester中几乎完全相同查询的一个示例

如果您得到一个错误,那么在这个代码之前可能有代码。这将导致错误。使用分号可以防止以后的代码出现问题

首先,递归子句应该显式列出列。不要使用select*和select,并期望两者匹配。因此,请列出以下列:

WITH TBL AS
(
   SELECT * FROM OUTPUT WHERE PRODUCT_ID = 5
   UNION ALL
   SELECT O.PRODUCT_ID,O.PRODUCT_NAME,O.PARENT_ID,O.PARENT_PRODUCT_NAME 
   FROM OUTPUT O
   JOIN TBL T1 ON O.PRODUCT_ID = T1.PARENT_ID
)
SELECT * FROM TBL
WHERE PRODUCT_ID <> 5
OPTION(MAXRECURSION 1000);

第二,您的名字中不应该有父产品名称。您有父ID。请使用该ID查找名称。

CTE定义要求前面的语句结束才能正确编译。所以你的代码应该是

WITH TBL AS (
      SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME
      FROM OUTPUT O
      WHERE PRODUCT_ID = 5
      UNION ALL
      SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME 
      FROM OUTPUT O JOIN
           TBL T1
           ON O.PRODUCT_ID = T1.PARENT_ID
     )

CTE定义要求正确编译之前结束的语句。所以你的代码应该是

WITH TBL AS (
      SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME
      FROM OUTPUT O
      WHERE PRODUCT_ID = 5
      UNION ALL
      SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME 
      FROM OUTPUT O JOIN
           TBL T1
           ON O.PRODUCT_ID = T1.PARENT_ID
     )
从:

当CTE用于作为批处理一部分的语句时,它前面的语句必须后跟分号

添加分号;在你之前的陈述之后/在你与。最好总是在语句前面加上分号。

来自:

当CTE用于作为批处理一部分的语句时,它前面的语句必须后跟分号

添加分号;在你之前的陈述之后/在你与。总是在语句前面加上分号可能是一种很好的做法