星期六, 8月 04, 2018

[SQL] UNION ALL 發生隱含轉換

利用 DMV 語法找到下述 TSQL 有隱含轉換存在
SELECT
  ........................
FROM [物料設計BOM表] AS w
  JOIN [物料View] AS m
WHERE
  ........................
  AND m.物料隱藏 = 0
[SQL] UNION ALL 發生隱含轉換-1

因為 Hide 欄位資料型態是 bit,想說把 0 改為 CAST(0 as bit) 就可以結案,沒想到執行計畫竟然還是有隱含轉換
SELECT
  ........................
FROM [物料設計BOM表] AS w
  JOIN [物料View] AS m
WHERE
  ........................
  AND m.物料隱藏 = CAST(0 AS bit)
最後發現是 View 內老早就隱含轉換了,Orz
SELECT
  .................. ,
  m.物料隱藏 -- Table 內真實存在欄位,資料型態為 bit
FROM 物料表 AS m
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM 客戶物料表
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM 客戶規格表
UNION ALL
SELECT
  .................. , 
  0 -- 配合 UNION ALL 的虛擬欄位
FROM 設計變更表
UNION ALL
SELECT
  .................. ,
  0 -- 配合 UNION ALL 的虛擬欄位
FROM 派工單檔頭
WHERE
  ..................
資料類型優先順序 文章內就可以查到,int 優先權是高於 bit,所以 View 內的 [物料隱藏] 欄位就被轉為 int 了,把 View 內的 0 通通改為 CAST(0 as bit),執行計畫中隱含轉換字樣終於消失了

[SQL] UNION ALL 發生隱含轉換-2

以前看見的網路文章都是在 WHERE 條件內,判斷等於時出現的,沒想到 UNION ALL 也會存在隱含轉換

沒有留言:

張貼留言