簡體   English   中英

SQL Server:uniqueidentifier上的ISNULL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM