【发布时间】:2020-06-30 14:18:44
【问题描述】:
当我在 SQL Server 中运行此 CTE 时,它说 declare 语句的语法不正确。
;WITH cte as
(
SELECT tblKBFolders.FolderID
from tblKBFolders
where FolderID = @FolderID
UNION ALL
SELECT tblKBFolders.FolderID
FROM tblKBFolders
INNER JOIN cte
ON cte.FolderID = tblKBFolders.ParentFolderID
)
declare @tblQueryFolders as table (FolderID uniqueidentifier)
insert into @tblQueryFolders
SELECT FolderID From cte;
但如果我将 declare 移到 CTE 之前,它运行得很好。
declare @tblQueryFolders as table (FolderID uniqueidentifier)
;WITH cte as
(
SELECT tblKBFolders.FolderID
from tblKBFolders
where FolderID = @FolderID
UNION ALL
SELECT tblKBFolders.FolderID
FROM tblKBFolders
INNER JOIN cte
ON cte.FolderID = tblKBFolders.ParentFolderID
)
insert into @tblQueryFolders
SELECT FolderID From cte;
这是为什么呢?
【问题讨论】:
-
与分号放置无关。第一个示例在数据语句中间(在 CTE 和
insert之间)有declare语句。 -
除了“这就是它的设计方式”之外,您还在寻找什么答案?
-
另外,分号是终止符,而不是“开始符”。不要以分号开始您的 CTE,但请以分号结束您的 CTE 之前的语句。
-
@HoneyBadger 是的,我明白这一点。由于某种原因,我已经看到很多这样写的例子......
-
不,CTE 不像您可以在任何地方声明和使用的变量。 CTE 是一个表达式,仅此而已。 CTE 和 SELECT 确实是并列的。
标签: sql-server tsql common-table-expression