在存储过程中执行CTE操作时获取无效的对象错误?

Feb*_*J S 5 sql-server-2005

我在存储过程中执行此操作时遇到错误的Object SubSkillIds错误?任何人都可以告诉我为什么会这样?

我的错误消息如下: -

消息208,级别16,状态1,过程SubSkillDelete,第47行
无效的对象名称'SubSkillIds'.

码:

WITH SubSkillIds (SubSkillId) AS
(
   -- Base case
   SELECT
        SubSkillId
   FROM dbo.SubSkill
   WHERE RegressionSubSkillId = @SubSkillId
   UNION ALL
   -- Recursive step
   SELECT
        S.SubSkillId
   FROM dbo.SubSkill S
   WHERE S.RegressionSubSkillId IN (
   SELECT
        SubSkillId
   FROM dbo.SubSkill
   WHERE RegressionSubSkillId = @SubSkillId)
)

SELECT  @SubSkillIdFound = SubSkillId
FROM SubSkill WHERE SubSkillId = @SubSkillId

DELETE FROM SubSkillActivity WHERE SubSkillId = @SubSkillId
DELETE FROM SubSkill WHERE RegressionSubSkillId
IN (SELECT * FROM SubSkillIds)
DELETE FROM SubSkill WHERE SubSkillId = @SubSkillId
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 10

CTE仅适用于下一个声明 - 您的 SELECT......

它在以后不再可用 - 这就是为什么你的第二个DELETE引用CTE的语句将失败的原因.

如果需要为多个单个语句保留CTE的值,则需要将这些值存储到临时表/表变量中.

  • +1.我认为CTE实际上是*它前面的语句的一部分*(在SQL Server中,无论如何)也是有效的. (3认同)