利用 DMV 語法找到下述 TSQL 有隱含轉換存在
SELECT
........................
FROM [物料設計BOM表] AS w
JOIN [物料View] AS m
WHERE
........................
AND m.物料隱藏 = 0
因為 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),執行計畫中隱含轉換字樣終於消失了
以前看見的網路文章都是在 WHERE 條件內,判斷等於時出現的,沒想到 UNION ALL 也會存在隱含轉換
沒有留言:
張貼留言