【问题标题】:Error while executing stored procedure in SQL SERVER 2005在 SQL SERVER 2005 中执行存储过程时出错
【发布时间】:2011-03-11 08:15:51
【问题描述】:

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

无效的对象名称“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 只使用一次。
  • 顺便说一句。如果您将选择(使用@gbn 建议)重写为加入,错误是否仍然存在?
  • 如果这是实际代码?还是您在此处发布的版本?
  • 您是否在程序之外尝试了 SSMS 中的脚本?它似乎不包含可能产生该错误的任何东西。在此处发布脚本时,您可能以某种方式错过了有问题的部分。然后尝试将它移回您的代码,如果不发现它是什么,也许它有助于消除错误。

标签: sql sql-server-2005


【解决方案1】:

来自在线书籍: 递归成员的 CTE_query_definition 中不允许以下项目:

选择不同的 [...]

你可以试试这个:

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

【讨论】:

    【解决方案2】:

    如果您的 ID 是您的主键,则它已经是 DISTINCT,这意味着如果 @ibram 回答是您的错误原因,您可以将其删除。我认为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
    

    【讨论】:

      【解决方案3】:

      如果您稍后在该过程中尝试引用 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  
      

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多