在SQL SERVER 2005中执行存储过程时出错

在SQL SERVER 2005中执行存储过程时出错,sql,sql-server-2005,Sql,Sql Server 2005,下面是我的示例存储过程。当我通过传递日期执行存储过程时,它会显示以下错误 无效的对象名称“TEMPP” --存储过程 ALTER PROCEDURE [dbo].[mystoredprocedure] @abc DATETIME //coming fron front-end AS BEGIN SET NOCOUNT ON; WITH TEMPP AS ( SELECT DISTINCT(ID), NAME FROM EMPLOYEE WHERE EMPDATE >

下面是我的示例存储过程。当我通过传递日期执行存储过程时,它会显示以下错误

无效的对象名称“TEMPP”

--存储过程

ALTER  PROCEDURE [dbo].[mystoredprocedure]
@abc DATETIME  //coming fron front-end
AS   
BEGIN  
SET NOCOUNT ON;

WITH TEMPP AS
 (  
SELECT DISTINCT(ID), NAME  
FROM EMPLOYEE WHERE EMPDATE > @abc 
 )  
    select DP.NAME INTO xy  from DEPARTMENT DP,TEMPP TE  
    where DP.ID=TE.ID  ;

SELECT * FROM xy;
DROP xy;
END
错在哪里

问候,

jn

来自在线图书: 递归成员的CTE_query_定义中不允许以下项目:

选择不同的 [……]

你可以试试这个:

ALTER  PROCEDURE [dbo].[mystoredprocedure]
@abc DATETIME  //coming fron front-end
AS   
BEGIN  
SET NOCOUNT ON;

    select DP.NAME from DEPARTMENT DP
    inner join
    (
        SELECT DISTINCT(ID), NAME  
        FROM EMPLOYEE WHERE EMPDATE > @abc
    )TE ON DP.ID=TE.ID;

END

如果您的ID是您的主键,那么它已经是不同的,这意味着如果@ibram answer是您错误的原因,您可以删除它。我认为
xy
是一个临时表,没有任何用处

ALTER  PROCEDURE [dbo].[mystoredprocedure]
   @abc DATETIME  //coming fron front-end
AS   
BEGIN  

SET NOCOUNT ON;

WITH TEMPP AS
(  
  SELECT ID, NAME  
  FROM EMPLOYEE WHERE EMPDATE > @abc 
)  
SELECT DP.NAME
FROM DEPARTMENT DP 
JOIN TEMPP TE
  ON DP.ID=TE.ID  ;

END

如果您稍后在过程中尝试引用CTE,通常会看到此错误。它仅对紧接其定义之后的语句有效

ALTER PROCEDURE [dbo].[mystoredprocedure] @abc DATETIME
AS
  BEGIN
      SET NOCOUNT ON;

      WITH TEMPP
           AS (SELECT DISTINCT ( name ),
                               number
               from   master..spt_values)
      select number
      INTO   xy
      from   TEMPP;

      SELECT *
      FROM   xy;

      DROP table xy;

    SELECT * FROM TEMPP /*Not Allowed: Throws this error*/
  END  

可能重复:我不这么认为-cte只使用一次。顺便说一句。如果将select(使用@gbn建议)重写为join,错误是否仍然存在?如果这是实际代码?或者您发布在这里的版本号?您是否在过程之外的SSMS中尝试了该脚本?它似乎不包含任何可能产生该错误的内容。在这里发布脚本时,您可能不知何故遗漏了令人不快的部分。然后试着把它移回你的代码中,如果不去发现它是什么的话,也许这将有助于消除错误。