2009-06-23 16 views
1

エラーが表示される理由を教えてください。 メッセージ207、レベル16、状態1、プロシージャExtractPDP4FromPDP、行21 無効な列名 'ContainsEX'。SQL 2005ケースステートメント - 無効な列名

次のストアドプロシージャを実行する場合。

CREATE PROCEDURE ExtractPDP4FromPDP 
    -- Add the parameters for the stored procedure here 
AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT PDP.*, LEFT(PDPCode,7) AS PDP7, PDP.Obsolete, 
     PDP.InvestorPDP, PDP.OnlineReport, PDP.ClientSpecific, 
     ContainsEX = CASE 
    WHEN(CHARINDEX(Left(PDPCode,5),'EX')>0) THEN 'True' 
    ELSE 'False' 
END, PDP4 = 
CASE 
    WHEN ContainsEX = 'True' THEN 'E' & SUBSTRING(pdpcode,5,3) 
    ELSE SUBSTRING(pdpcode,6,3) 
END 
FROM PDP 
WHERE (((PDP.Obsolete)='False') AND ((PDP.InvestorPDP)='True') AND 
    ((PDP.OnlineReport)='False') AND ((PDP.ClientSpecific)='False')); 
END 
GO 

あなたはすぐにそれを定義した後文でカラムを使用することはできません事前に

答えて

1

をありがとうございました。

1つの選択肢あなたの表現を構築するか、ネストされたクエリを使用するように積み重ねられたCTEを使用することです:

WITH cte1 AS (
    SELECT x, x AS y 
    FROM t 
),cte2 AS (
    SELECT x, y, x + y AS z 
    FROM cte1 
) 
SELECT x, y, z 
FROM cte2 
7

SQL Serverは、あなたが同じレベルでフィールドを参照することはできません。あなたは同様に、サブクエリを作成する必要があると思います:

select *, 
    PDP4 = CASE 
     WHEN ContainsEX = 'True' THEN 'E' & SUBSTRING(pdpcode,5,3) 
     ELSE SUBSTRING(pdpcode,6,3) 
    END 
from (
    select *, LEFT(PDPCode,7) AS PDP7, PDP.Obsolete, 
     PDP.InvestorPDP, PDP.OnlineReport, PDP.ClientSpecific, 
     ContainsEX = CASE 
      WHEN(CHARINDEX(Left(PDPCode,5),'EX')>0) THEN 'True' 
      ELSE 'False' 
     END 
    from PDP 
    WHERE (((PDP.Obsolete)='False') AND ((PDP.InvestorPDP)='True') AND 
    ((PDP.OnlineReport)='False') AND ((PDP.ClientSpecific)='False')) 
) sub 
0

あなたのケースの文が正しくありません。 'value' = 'value' then 'CONTAINEX =' grandma 'のようにするEND