2009-06-23 21 views
1

Kann mir jemand sagen, warum ich Fehler erhalte: Msg 207, Level 16, Status 1, Prozedur ExtractPDP4FromPDP, Zeile 21 Ungültiger Spaltenname 'ContainsEX'.sql 2005 case statement - Ungültiger Spaltenname

beim Ausführen der folgenden gespeicherten Prozedur.

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 

danken Ihnen im Voraus

Antwort

1

Sie keine Spalte in einer Erklärung unmittelbar nach der Definition sie verwenden können.

Eine Alternative ist CTEs gestapelt zu benutzen, um Ihre Ausdrücke oder verwenden Sie verschachtelte Abfragen aufzubauen:

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 Ihnen nicht erlaubt, auf die Felder auf der gleichen Ebene zu verweisen. Sie müssten eine Unterabfrage erstellen, wie zum Beispiel:

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

Ihre Fallanweisung ist nicht korrekt. FALL WENN 'Wert' = 'Wert' DANN 'etwas tun wie CONTAINEX =' Oma 'ENDE

Verwandte Themen