我有一个大问题,抛出一个我已经削减到相当小块的错误。
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,同样的错误。所以我肯定在想坏数据。但还是不知道如何真正找到它。
答案 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
,这样您就不会有这样的麻烦。