2016-05-18 138 views
2

我想合併存儲過程的結果集。從存儲過程合併結果集

我使用UNION,但它不工作,並拋出象這樣的錯誤:

消息156,級別15,狀態1,行中的關鍵字「聯盟」近147
不正確的語法。

Msg 102,Level 15,State 1,Line 251
'END'附近語法不正確。

我也嘗試過放入臨時表,但是一旦我開始重用表,它會說明臨時表已經存在。

任何幫助將不勝感激,謝謝。

當前的結果:

lnid  result Score_result 
aaabbbccc 7B  Current 

lnid  result Score_result 
aaabbbccc 4D  Override 

預期結果:

lnid  result Score_result 
aaabbbccc 7B  Current 
aaabbbccc 4D  Override 

存儲過程:

CREATE PROCEDURE [dbo].[Results] 
    [email protected] AS VARCHAR(50) = NULL, 
    [email protected] AS VARCHAR(50) = NULL, 
    [email protected] AS DATETIME, 
    [email protected] AS DATETIME 
AS 
BEGIN 
    DECLARE @LanID AS VARCHAR(50) 
    DECLARE @period AS VARCHAR(50) 
    DECLARE @strtdt AS DATETIME 
    DECLARE @enddt AS DATETIME 

    SET @LanID = 'aaabbbccc' 
    SET @period = 'H1' 
    SET @strtdt ='2015-10-01' 
    SET @enddt = DATEADD(MONTH, 11, @strtdt) 

    IF NOT EXISTS (SELECT * 
        FROM overridetable 
        WHERE AGENT = @LanID 
        AND KRA_HALF = @strtdt 
        AND BIT_CURRENT = 1 
        AND IS_FULL_YEAR = 0) 
    BEGIN 
     IF NOT EXISTS (SELECT * 
         FROM periodictable 
         WHERE repdate BETWEEN @strtdt AND @enddt 
         AND lnid = @LanID 
         AND rep_period = @period) 
     BEGIN 
      IF @period IN ('H1', 'H2') 
       (SELECT  
        lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)), 0) AS VARCHAR) + ' ' + CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result 
           ,'Current' as 'Score_Result' 
       FROM  
        (SELECT 
          repdate, lnid, team_Code, numscre, 
          CASE 
          WHEN cmpscre = 'A' THEN 1 
          WHEN cmpscre = 'B' THEN 2 
          WHEN cmpscre = 'C' THEN 3 
          END AS cmpscre, 
          rep_period, 1 AS CounterOfRep, 
          CASE 
          WHEN rep_period IN ('Q1','Q2') THEN 'H1' 
          WHEN rep_period IN ('Q3','Q4') THEN 'H2' 
          END AS HalfYearPeriod 
         FROM 
          periodictable 
         WHERE 
          rep_period LIKE 'Q%' 
          AND repdate BETWEEN @strtdt AND @enddt) tmp 
       WHERE  
        lnid = @LanID 
        AND halfyearperiod = @period 
       GROUP BY  
        HalfYearPeriod, lnid, team_code) 

      ELSE IF @period IN ('FY') 
       (SELECT  
        lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result    
           ,'Current' as 'Score_Result' 
       FROM   
        (SELECT 
         repdate, lnid, team_Code, numscre, 
         CASE 
          WHEN cmpscre = 'A' THEN 1 
          WHEN cmpscre = 'B' THEN 2 
          WHEN cmpscre = 'C' THEN 3 
         END AS cmpscre, 
         rep_period, 1 AS CounterOfRep, 
         'FY' AS FullYearPeriod 
        FROM 
         periodictable 
        WHERE 
         rep_period LIKE 'Q%' 
         AND repdate BETWEEN @strtdt AND @enddt) tmp 
       WHERE  
        lnid = @LanID 
        AND FullYearPeriod = @period 
       GROUP BY  
        FullYearPeriod, lnid, team_code) 

        ELSE 

        (SELECT  lnid, CAST (numscre AS VARCHAR) + ' ' + 
           CAST (cmpscre AS VARCHAR) Result 
           ,'Current' as 'Score_Result' 
        FROM  periodictable 
        WHERE  lnid = @LanID 
           AND rep_period = @period 
           AND rep_period LIKE 'Q%' 
           AND repdate BETWEEN @strtdt AND @enddt) 

      END 

     ELSE 

      BEGIN 

       (SELECT  lnid, CAST(numscre AS VARCHAR) + ' ' + CAST(cmpscre AS VARCHAR) AS Result 
          ,'Current' as 'Score_Result' 
       FROM  periodictable 
       WHERE  repdate between @strtdt AND @enddt 
          AND lnid = @LanID 
          AND rep_period = @period) 
      END 

    END 

    ELSE 

    BEGIN 

     (SELECT Agent AS lnid, CAST(CAST(ROUND(Numerical_Override, 0) AS INT) AS VARCHAR) + ' ' + 
       CAST((CASE WHEN Competency_Override = 1 THEN 'A' 
          WHEN Competency_Override = 2 THEN 'B' 
          WHEN Competency_Override = 3 THEN 'C' ELSE '*' END) AS VARCHAR) AS Result 
       ,'Current' as 'Score_Result' 
     FROM overridetable 
     WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 


    END 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 






IF EXISTS 

    (SELECT * 
    FROM overridetable 
    WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 




    BEGIN 

      IF NOT EXISTS 

      (SELECT  * 
      FROM  periodictable 
      WHERE  repdate BETWEEN @strtdt AND @enddt 
         AND lnid = @LanID 
         AND rep_period = @period) 


       BEGIN 


        IF   @period IN ('H1', 'H2') 

        (SELECT  lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + 
           CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result 
           ,'Override' as 'Score_Result' 
        FROM  (SELECT repdate, lnid, team_Code, numscre, 
           CASE WHEN cmpscre = 'A' THEN 1 
             WHEN cmpscre = 'B' THEN 2 
             WHEN cmpscre = 'C' THEN 3 END AS cmpscre, 
           rep_period, 1 AS CounterOfRep, 
           CASE WHEN rep_period IN ('Q1','Q2') THEN 'H1' 
             WHEN rep_period IN ('Q3','Q4') THEN 'H2' END AS HalfYearPeriod 
           FROM periodictable 
           WHERE rep_period LIKE 'Q%' 
             AND repdate BETWEEN @strtdt AND @enddt)tmp 
        WHERE  lnid = @LanID 
           AND halfyearperiod = @period 
        GROUP BY HalfYearPeriod,lnid, team_code) 


        ELSE IF  @period IN ('FY') 

        (SELECT  lnid, CAST (ROUND(SUM(CAST(numscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) AS VARCHAR) + ' ' + 
           CAST (CASE WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 1 THEN 'A' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 2 THEN 'B' 
              WHEN ROUND(SUM(CAST(cmpscre AS FLOAT))/SUM(CAST(counterOfRep AS FLOAT)),0) = 3 THEN 'C' END AS VARCHAR) Result    
           ,'Override' as 'Score_Result' 
        FROM  (SELECT repdate, lnid, team_Code, numscre, 
           CASE WHEN cmpscre = 'A' THEN 1 
             WHEN cmpscre = 'B' THEN 2 
             WHEN cmpscre = 'C' THEN 3 END AS cmpscre, 
           rep_period, 1 AS CounterOfRep,'FY' AS FullYearPeriod 
           FROM periodictable 
           WHERE rep_period LIKE 'Q%' 
             AND repdate BETWEEN @strtdt AND @enddt)tmp 
        WHERE  lnid = @LanID 
           AND FullYearPeriod = @period 
        GROUP BY FullYearPeriod,lnid, team_code) 


        ELSE 

        (SELECT  lnid, CAST (numscre AS VARCHAR) + ' ' + 
           CAST (cmpscre AS VARCHAR) Result 
           ,'Override' as 'Score_Result' 
        FROM  periodictable 
        WHERE  lnid = @LanID 
           AND rep_period = @period 
           AND rep_period LIKE 'Q%' 
           AND repdate BETWEEN @strtdt AND @enddt) 

      END 

     ELSE 

      BEGIN 

       (SELECT  lnid, CAST(numscre AS VARCHAR) + ' ' + CAST(cmpscre AS VARCHAR) AS Result 
          ,'Override' as 'Score_Result' 
       FROM  periodictable 
       WHERE  repdate between @strtdt AND @enddt 
          AND lnid = @LanID 
          AND rep_period = @period) 
      END 


    END 

    ELSE 

    BEGIN 

    (SELECT @LanID AS lnid, '--' AS Result, 
      'Override' as 'Score_Result') 

    END 

END 
+0

你是什麼意思? SP工作得很好。你是說UNION還能工作嗎? – lucas

+0

存儲過程不包含單詞UNION。您試圖運行的查詢是什麼? –

+0

嗨約翰,試想一下,UNION被放置在兩個查詢(放置長評論的地方)的休息處。我只是拿出來呈現真正的工作查詢。謝謝。 – lucas

回答

2

你需要一個BEGIN地方。

由於原來存儲的proc工作正常,最簡單的方法是創建2個臨時表,並在其中執行原始的select s,做select into s。然後做一個選擇在你的union這兩個臨時表。

存儲過程的主體將是這個樣子:

create temp table 1 ...... 
create temp table 2 ......... 

IF NOT EXISTS 

(SELECT * 
FROM overridetable 
WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 

BEGIN 
    IF NOT EXISTS (SELECT  * 
     FROM  periodictable 
     WHERE  repdate BETWEEN @strtdt AND @enddt 
        AND lnid = @LanID 
        AND rep_period = @period) 

     BEGIN 

      IF   @period IN ('H1', 'H2') 
       select into temp table 1 
      ELSE IF  @period IN ('FY') 
       select into temp table 1 
      ELSE 
       select into temp table 1 
     END 
    ELSE 
     BEGIN 
      select into temp table 1 
     END 
END 
ELSE 
BEGIN 
    select into temp table 1 
END 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 

IF NOT EXISTS 

(SELECT * 
FROM overridetable 
WHERE AGENT = @LanID AND KRA_HALF = @strtdt AND BIT_CURRENT = 1 AND IS_FULL_YEAR = 0) 

BEGIN 
    IF NOT EXISTS (SELECT  * 
     FROM  periodictable 
     WHERE  repdate BETWEEN @strtdt AND @enddt 
        AND lnid = @LanID 
        AND rep_period = @period) 

     BEGIN 

      IF   @period IN ('H1', 'H2') 
       select into temp table 2 
      ELSE IF  @period IN ('FY') 
       select into temp table 2 
      ELSE 
       select into temp table 2 
     END 
    ELSE 
     BEGIN 
      select into temp table 2 
     END 
END 
ELSE 
BEGIN 
    select into temp table 2 
END 

(select * from temp table 1) union (select * from temp table 2) 
+0

是的,這是一個好主意!即時工作在查詢現在。讓我知道如果我遇到困難。謝謝! – lucas

+0

謝謝!剛剛好。接受你的回答!謝謝您的幫助!! – lucas

+0

@lucas很高興有幫助:)。 – Ash