Ric*_*ley 4 sql sql-server insert common-table-expression sql-server-2012
我已经想出了如何使用通用表表达式(感谢 StackOverflow!)递归地查找向某个经理报告的所有员工。
这是对我有用的代码:
WITH MyCTE AS
(
SELECT [WWID] FROM [x500]..[WorkerPublicExtended]
WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB')
UNION ALL
SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended]
INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID
WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL
AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
)
SELECT *, 'MGR+10624529' AS [source] FROM MyCTE
Run Code Online (Sandbox Code Playgroud)
这完美地工作。但是,如果我尝试将其插入到另一个表中(这是最终目标),我找不到不会引发一个或多个错误的此代码的任何语法变体。有人可以帮我把这些放在一起吗?
INSERT INTO [LTDtraining].[dbo].[pop00001]
WITH MyCTE AS
(
SELECT [WWID] FROM [x500]..[WorkerPublicExtended]
WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB')
UNION ALL
SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended]
INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID
WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL
AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
)
SELECT *, 'MGR+10624529' AS [source] FROM MyCTE
Run Code Online (Sandbox Code Playgroud)
它抛出如下错误:
消息 102,级别 15,状态 1,第 2 行
“MyCTE”附近的语法不正确。
或者一直流行的
消息 156,级别 15,状态 1,第 2 行
关键字“WITH”附近的语法不正确。消息 319,级别 15,状态 1,第 2 行
关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前一条语句必须以分号终止。消息 102,级别 15,状态 1,第 9 行
')' 附近的语法不正确。
如果我插入建议的分号,它会响应
消息 102,级别 15,状态 1,第 1 行
“;”附近的语法不正确。
所以这让我觉得我不知道我在这里做什么,SQL也不知道。
通过将INSERT语句向下移动到下面,可以很容易地修复错误,如下所示WITH:
WITH MyCTE AS
(
SELECT [WWID] FROM [x500]..[WorkerPublicExtended]
WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB')
UNION ALL
SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended]
INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID
WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL
AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
)
INSERT INTO [LTDtraining].[dbo].[pop00001]
SELECT *, 'MGR+10624529' AS [source] FROM MyCTE
Run Code Online (Sandbox Code Playgroud)