Ssrs

使用“case 語法”的更新語句無法更新臨時表中的特定列

  • April 25, 2017

查看目前 SSRS 遷移的儲存過程。我注意到下面列出的臨時表 (#tempShip) 的 case 語法對臨時表中的“ord_status”列沒有影響。為臨時表收集數據的儲存過程相當龐大,因此我將避免發布。但我相信通過為更新提供的程式碼它可能會提供一些理由。

問題:

  1. 您可以利用臨時表上的 case 語句作為更新嗎?
  2. 除了案例陳述之外,我還應該嘗試另一種方法嗎?(我不認為使用帶有“IF”或“WHERE EXISTS with a select statement”的子查詢會對此有所幫助)

筆記:

***儲存過程執行沒有任何錯誤,臨時表按預期填充數據(但使用 case 語句更新沒有預期結果)

***通過做一個簡單的案例陳述,如下所示,翻譯發生得很好

用於測試臨時表中 ord_status 數據的案例轉換的基本查詢。輸出正確

select ord_status,
CASE
    WHEN RTRIM([ord_status]) = 'N' THEN 'New'
    WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
    WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
    ELSE ''
END
from #tempShip

***正在更新臨時表的儲存過程結束

UPDATE  [#tempShip] SET
       [#tempShip].[DUP] = 1,
       [#tempShip].[ord_status] = 
          CASE
                WHEN RTRIM([ord_status]) = 'N' THEN 'New'
                WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
                WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
                ELSE ''
          END

       FROM #tempShip
        INNER JOIN
   (
       SELECT X.order_N_ext, COUNT(X.order_N_ext) AS dup
       FROM #tempShip AS X
       GROUP BY X.order_N_ext
   ) AS Y
        ON #tempShip.order_N_ext = Y.order_N_ext
   WHERE Y.dup > 1;
   ----- -- mbs 3/30/2017  #22844 - add parameter @ship_type 
   SELECT * FROM #tempShip 
   WHERE ship_type LIKE @ship_type 
   -------<<<


END
DROP TABLE #tempShip

**order_N_ext

SELECT O.order_no
   , O.ext
   , CONVERT(varchar(20), O.order_no) + ' - ' + CONVERT(varchar(2), O.ext) 
AS 'order_N_ext'

數據範例:

Ord_Num  BD order_N_ext Loc     Cust        Ship_date                      Ord_Status
1252868  1  1252868 - 1 RAS HQ  21115   2017-04-19 00:00:00.000 2570.63    P       
1253995  1  1253995 - 1 RAS HQ  11471   2017-04-19 00:00:00.000 1270.45    Q       
1254526  0  1254526 - 0 RAS HQ  24104   2017-04-19 00:00:00.000 2214.67    P             

這是解決方案:(更新語句必須重新排列,以便它們自己執行。)

UPDATE  [#tempShip] SET  [ord_status] = CASE
               WHEN RTRIM([ord_status]) = 'N' THEN 'New'
               WHEN RTRIM([ord_status]) = 'Q' THEN 'Printed'
               WHEN RTRIM([ord_status]) = 'P' THEN 'Picked'
               ELSE ''
               END

UPDATE                 [#tempShip] SET           [#tempShip].[DUP] = 1
FROM #tempShip
INNER JOIN
(
SELECT X.order_N_ext, COUNT(X.order_N_ext) AS dup
FROM #tempShip AS X
GROUP BY X.order_N_ext
) AS Y
ON #tempShip.order_N_ext = Y.order_N_ext
WHERE Y.dup > 1;
   ----- -- mbs 3/30/2017  #22844 - add parameter @ship_type 
   SELECT * FROM #tempShip 
   WHERE ship_type LIKE @ship_type 
   -------<<<

引用自:https://dba.stackexchange.com/questions/171858