在SQL SERVER 2005中执行存储过程时出错
下面是我的示例存储过程。当我通过传递日期执行存储过程时,它会显示以下错误 无效的对象名称“TEMPP” --存储过程在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 >
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中尝试了该脚本?它似乎不包含任何可能产生该错误的内容。在这里发布脚本时,您可能不知何故遗漏了令人不快的部分。然后试着把它移回你的代码中,如果不去发现它是什么的话,也许这将有助于消除错误。