這裏的情況的一個例子:爲什麼過濾後的視圖在過濾後的查詢中使用時無法轉換?
CREATE TABLE dbo.TestConversionTable
(
Value VARCHAR(MAX)
)
INSERT INTO dbo.TestConversionTable VALUES ('1')
INSERT INTO dbo.TestConversionTable VALUES ('foo')
CREATE VIEW dbo.TestConversion
AS
SELECT CONVERT(BIGINT,Value) Value
FROM dbo.TestConversionTable
WHERE Value <> 'foo'
GO
SELECT * FROM dbo.TestConversion --this works
SELECT * FROM dbo.TestConversion WHERE Value = 1 --Error converting data type varchar to bigint.
SELECT * FROM dbo.TestConversion WHERE Value = '1' --Same thing, this doesn't work either.
我希望這兩種方案的工作,因爲視圖已經過濾掉壞的數據。更奇怪的是,第二個查詢也不起作用。我只能在它們兩個上獲取估計的執行計劃(因爲我實際上無法無誤地運行查詢),並且它們是相同的。根據估計的計劃,在應用WHERE Value = 1
之前,將首先過濾不良數據。
編輯:爲了測試查詢計劃,我將CONVERT改爲TRY_CONVERT。這些計劃的結果仍然是相同的,它看起來像在轉換之前發生的過濾器:
見實際查詢計劃使用TRY_CONVERT編輯成我的問題。在轉換髮生之前,應先將無效記錄過濾掉。 – Lunyx
現在看我的編輯,這個過濾可能會發生也可能不會發生 – TheGameiswar
實際上,我的查詢計劃是實際的執行計劃,因爲您可以在過濾器上看到估計的vs實際行。不過,我只是再次檢查了這一點,我懷疑這可能是我使用的第三方分析器工具的問題,因爲SSMS中的計劃實際上顯示轉換髮生在謂詞的前半部分,而不是將謂詞顯示爲只檢查'<>'foo''。 – Lunyx