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

问题描述:

以下是我的示例存储过程。当我通过传递DATE执行存储过程时,它显示的错误如下。在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 > @abc 
) 
    select DP.NAME INTO xy from DEPARTMENT DP,TEMPP TE 
    where DP.ID=TE.ID ; 

SELECT * FROM xy; 
DROP xy; 
END 

哪里是错误的?

问候,

JN

+0

可能重复:http://stackoverflow.com/questions/954016/multiple-select-statements-using-sql-server-2005-with-statement – Bravax 2011-03-11 08:25:09

+0

我不这么认为 - CTE是只用一旦。 – Goran 2011-03-11 08:27:25

+0

顺便说一句。如果您将select(使用@gbn建议)重写入连接,错误是否仍然存在? – Goran 2011-03-11 08:29:51

从书本在线: 下列物品不得在递归成员的CTE_query_definition:

SELECT DISTINCT [...]

你可以试试这个:

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 
+0

OP代码中没有递归成员。 – Goran 2011-03-11 08:39:41

+0

好的。解决办法是什么? – sriramjitendra 2011-03-11 11:45:57

如果您的ID是您的主键,则它已经是DISTINCT,这意味着如果@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