Sql server UniqueIdentifier到GUID连接失败

Sql server UniqueIdentifier到GUID连接失败,sql-server,tsql,join,guid,uniqueidentifier,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 引发的错误是“从字符串转换为uniqueidentif

我有一个大的查询抛出了一个错误,我已经缩减到相当小的块

SELECT
    Reconciliation_Receiving.UserId, *
FROM
    Reconciliation_Receiving 
    LEFT JOIN Profiles.dbo.UserObject ReceivingUser ON Reconciliation_Receiving.UserId = ReceivingUser.g_user_id
引发的错误是“从字符串转换为uniqueidentifier时转换失败。”

这个错误似乎与UserObject和Receiving之间的左连接有关,因为如果我删除它,查询就会执行

对账_Receiving.UserId是唯一标识符,而ReceivingUser.g_user_id是GUID(nchar(38))。我想,这种差异可能是相关的,但我不知道到底有多大。据我所知,两者都有有效的guid作为数据(尽管这可能是错误的,这是我将继续研究的一个途径)。我正在研究的特定案例有一个WHERE子句(为简洁起见省略),其中所有的condition_Receiving.UserId值都为NULL…但我想坏数据可能在其他地方,因为据我所知,连接是在WHERE过滤完成之前完成的

我试着搜索存储在UserObject列中的数据的长度,看看是否有一些坏数据以某种方式存储在那里,但没有任何结果

也就是说,数据可能有什么问题?如何找到它?或者是别的什么

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

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

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

消息告诉您确切的问题:字符串无法转换为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

你最好不要将guid存储为字符串,而是存储为
UNIQUEIDENTIFIER
,这样你就不会遇到这样的问题。

也许
CAST(ReceivingUser.g_user\u id作为UNIQUEIDENTIFIER)
?@MichaelPerrenoud有趣的是,我只是在尝试这个…我要添加一些信息…你当然可以将左侧转换为nchar(38)。这不会给你带来任何错误。@MikaelEriksson:是的,但我担心性能,这只会掩盖潜在的数据问题。是的。这就是为什么我说“据我所知”,然后接着说这仍然是我所关注的领域。不幸的是,我无法更改数据类型。正如我提到的,我怀疑数据不好,但不知道如何找到它。有趣的是,我最终找到了与您提供的解决方案相同的解决方案(因此您得到了支票和提价)。我没有想到GUID类型会允许非十六进制字符;事实证明确实如此,而且显然有人直接在数据库中篡改数据,并在guid中添加了一些不好的字符。Grr。谢谢(值得一提的是,我完全同意你的观点……它们应该是唯一的标识符……这就是为什么我的部分,接收者部分,就是这样。不幸的是,GUID列是另一个系统的一部分,不可更改……所以我有点纠结于这些差异。)