2013-08-22 189 views
2

现在我收到'无效的对象名称qryTI_3'的错误。当我尝试执行整个过程时,我只会遇到此错误,但我仍然可以保存该过程。我已验证所有字段确实存在于引用的表中。这个查询有什么问题?无效的对象名称 - SQL Server 2008

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 


WITH qryTI_1 AS 
(
SELECT tblTSF.fldFPK, tblTSF.fldPK, tblTSF.fldCI, tblTSF.fldNI 
FROM tblTSF 
WHERE (((tblTSF.fldMN)<>-254)) 
), 

qryTI_2 AS 
(
SELECT tblTSF.fldFPK, tblTSF.fldPK, tblAL.fldLN AS fldCI, 0 AS fldNI 
FROM tblAL, tblTSF 
GROUP BY tblTSF.fldFPK, tblTSF.fldPK, tblAllLevels.fldLN 
HAVING (((tblAL.fldLN)<>0 And (tblAL.fldLN)<>6)) 
), 

qryTI_3 AS 
(
SELECT * FROM qryTI_1 UNION SELECT * FROM qryTI_2 
) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(fldCI) 
        from qryTI_3 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT fldPK, fldFPK, ' + @cols + ' 
       FROM 

       (
       SELECT fldPK 
         ,fldFPK 
         ,fldNI 
         ,fldCI 
       FROM qryTI_3  
       ) as x 
       PIVOT 
       (
        Sum(fldNI) FOR fldCI IN (' + @cols + ') 
       ) as p ' 

     execute sp_executesql @query 

回答

4

CTE只存在于该语句的持续时间。

WITH 
    cte1 AS 
    (blah) 
    , 
    cte2 AS 
    (blah) 
    , 
    cte3 AS 
    (blah) 

    statement1; -- The CTE definitions are part of this statement 

    statement2; -- They are not part of this statement, they're gone by now 

所以,一旦你的SET语句完成,热膨胀系数是没了,你曾经达到execute调用之前。

更不用说你对execute的调用也创建了一个新的范围,CTE和变量也不存在。

尝试制作这些视图而不是CTE - 因此它们存在多个语句,并在您致电execute时创建的范围内可见。

相关问题