GUID加入失败的UniqueIdentifier

时间:2014-02-04 16:26:43

标签: sql-server tsql join guid uniqueidentifier

我有一个大问题,抛出一个我已经削减到相当小块的错误。

SELECT
    Reconciliation_Receiving.UserId, *
FROM
    Reconciliation_Receiving 
    LEFT JOIN Profiles.dbo.UserObject ReceivingUser ON Reconciliation_Receiving.UserId = ReceivingUser.g_user_id

引发的错误是“从字符串转换为uniqueidentifier时转换失败。”

错误似乎与UserObject和Reconciliation_Receiving之间的LEFT JOIN有关,因为如果删除它,则执行查询。

Reconciliation_Receiving.UserId是UNIQUEIDENTIFIER,而ReceivingUser.g_user_id是GUID(nchar(38))。我认为,这种差异可能是相关的,但我没看到究竟如何。据我所知,两者都有有效的guid作为数据(虽然这可能是错误的,并且是我要继续关注的一种途径。)我正在看的特殊情况有一个WHERE子句(为简洁省略) )其中所有Reconciliation_Receiving.UserId值都为NULL ...但我猜错数据可能在其他地方,因为我的理解是在WHERE过滤完成之前完成了连接。

我尝试搜索存储在UserObject列中的数据长度,以查看是否有某些不良数据以某种方式存储在那里,但没有任何内容跳出来。

那说,数据可能有什么问题?怎么找到它?或者它可能是别的什么?

新信息:当我尝试以下操作时:

SELECT CAST(g_user_id AS uniqueidentifier) 
FROM Profiles.dbo.UserObject

它开始打印一些值然后bam,同样的错误。所以我肯定在想坏数据。但还是不知道如何真正找到它。

1 个答案:

答案 0 :(得分:2)

该消息告诉您确切的问题:无法将字符串转换为guid。现在您知道了:a)某处有转换; b)字符串数据是不可转换的。

  

“据我所知,两者都有有效的guid作为数据”

不,该消息表明情况并非如此。这个消息非常明确。

找到无效数据。例如,像这样:

SELECT *
FROM ReceivingUser
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, ReceivingUser.g_user_id) IS NULL AND ReceivingUser.g_user_id IS NOT NULL

您最好不要将Guids存储为字符串,而应存储为UNIQUEIDENTIFIER,这样您就不会有这样的麻烦。