with tmpCTE AS
(
select P_Name,Prefix from dbo.Provider
)
--CTE 之后必须跟随引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 语句。
update tmpCTE set P_Name=P_Name where 1=2
declare @P_Name varchar(20);
declare @Prefix varchar(2);
DECLARE MyCursor CURSOR FOR SELECT P_Name,Prefix from tmpCTE;
OPEN MyCursor;
FETCH NEXT FROM MyCursor INTO @P_Name,@Prefix
WHILE @@FETCH_STATUS = 0
BEGIN
print @P_Name;
print @Prefix;
FETCH NEXT FROM MyCursor INTO @P_Name,@Prefix
END

解决方案 »

  1.   

    消息 208,级别 16,状态 1,第 9 行
    对象名  'tmpCTE' 无效。在执行了 update tmpCTE set P_Name=P_Name where 1=2 
    之后再DECLARE MyCursor CURSOR FOR SELECT P_Name,Prefix from tmpCTE;就出错了。
      

  2.   

    加上update tmpCTE set P_Name=P_Name where 1=2 之后这句话出问题:DECLARE MyCursor CURSOR FOR SELECT P_Name,Prefix from tmpCTE;
      

  3.   

    CTE就不能使用两次?
    没人知道啊?!!!!!!!!!!
      

  4.   

    在这里用CTE是不行的,可以改用表变量,将CTE中的数据存到表变量中去,如下(红字为新增部分):
    DECLARE @TempTable Table
    (
       P_Name varchar(20),
       Prefix varchar(2)
    );
    with   tmpCTE   AS
    (
    select   P_Name,Prefix   from   dbo.Provider
    )
    INERT INTO @TempTable SELECT * FROM tmpCTE;declare   @P_Name   varchar(20);
    declare   @Prefix   varchar(2);
    DECLARE   MyCursor   CURSOR   FOR   SELECT   P_Name,Prefix   from   @TempTable ;
    OPEN   MyCursor;
    FETCH   NEXT   FROM   MyCursor   INTO   @P_Name,@Prefix
    WHILE   @@FETCH_STATUS   =   0
    BEGIN
    print   @P_Name;
    print   @Prefix;
    FETCH   NEXT   FROM   MyCursor   INTO   @P_Name,@Prefix
    END