[英]SQL Server: ISNULL on uniqueidentifier
我試圖在WHERE
子句中比較列col1
和變量@myvar
。 兩者通常都包含GUID,但也可能具有NULL值。 我以為我可以通過使用WHERE ISNULL(col1, '')=ISNULL(@myvar, '')
來解決NULL=NULL
計算為FALSE的事實。 這將比較兩個空字符串,並評估為TRUE。
但是,這將產生以下錯誤消息:
消息8169,級別16,狀態2,行3轉換從字符串轉換為uniqueidentifier時失敗。
我試過了
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
相同的錯誤消息。
兩個問題:首先,我試圖將uniqueidentifier變量 - 即使它具有NULL值 - 轉換為(空!)字符串,而不是相反,如錯誤消息所示。 是什么賦予了?
第二,有沒有更好的方法來說明我需要的WHERE子句,以允許比較可能為NULL的uniqueidentifier?
由於您傳遞的第一個參數isnull
不是文字null
,它將確定該調用的返回類型,在您的情況下是唯一uniqueidentifier
。 第二個參數''
,不能轉換為這種類型,因此你得到的錯誤。
解決這個問題的一種方法就是明確檢查null
s:
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
我認為下面的表達式可用於檢查GUID列是否為空
CAST(0x0 AS UNIQUEIDENTIFIER)
就像是
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)
ISNULL
不適合您的原因是替換值(如果檢查表達式確實為null,則使用的值)必須可以隱式轉換為檢查表達式的類型。
您的WHERE
子句可以使用col IS NULL AND @var IS NULL
來檢查該狀態。
正如其他人所指出的那樣,從結果中排除NULL值然后進行比較。 您可以使用COALESCE從比較中排除NULL值。
請嘗試以下代碼:
WHERE ISNULL([Guid], NEWID()) = @myvar
以下是克服此問題的另一種方法:
DECLARE @myvar uniqueidentifier = NEWID()
SELECT * FROM TABLE
Where ISNULL(col1,@myvar) = ISNULL(Col2,@myvar)
這將解決您的錯誤。 從字符串轉換為uniqueidentifier
時轉換失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.