在Where子句中使用GUID

10

由于某些原因,我无法在GUID列上使用比较运算符,它不会返回任何结果。

请看下面的代码,将WHERE语句设置为“secguid”列的确切值,但没有返回结果。出了什么问题?

SELECT * FROM dbMobileFile

SELECT * FROM dbMobileFile WHERE secguid = '3137459D-EFDE-449E-94A3-89345A8580FA'

SELECT * FROM dbMobileFile WHERE secguid LIKE '3137459D-EFDE-449E-94A3-89345A8580FA'

使用LIKE也不起作用。

enter image description here

enter image description here


尝试在Where子句中修剪secguid。 - Jaydip Jadhav
请展示您的LIKE查询。并尽量使用问题中的文本(除了图片)。 - Sangharsh
2
你能确认一下表的定义吗?特别是,secguid 是否被定义为 uniqueidentifier - Damien_The_Unbeliever
目前它是nvarchar类型。 - W.H
@W.H 试试使用 LTRIMRTRIM。我想应该可以解决问题。 - Satwik Nadkarny
显示剩余4条评论
6个回答

10

试一试

SELECT      [fileID],
            [fileCOde],
            [filePassword],
            [fileDescription],
            [rowguid],
            [secguid]
FROM        [dbo].[dbMobileFile]
WHERE       CAST(secguid as uniqueidentifier) = CAST('3137459D-EFDE-449E-94A3-89345A8580FA' as uniqueidentifier)

WHERE secguid = CAST('3137459D-EFDE-449E-94A3-89345A8580FA' as uniqueidentifier) 对我也有效。 - mems

2

既然您提到该列存储为NVARCHAR,那么字符串可能具有前导或尾随空格,这就是为什么它可能不会在带有WHERE子句的查询中弹出的原因。

您可以尝试这个:

SELECT      [fileID],
            [fileCOde],
            [filePassword],
            [fileDescription],
            [rowguid],
            [secguid]
FROM        [dbo].[dbMobileFile]
WHERE       LTRIM(RTRIM(secguid)) = '3137459D-EFDE-449E-94A3-89345A8580FA'

这应该显示您的结果,因为在 WHERE 子句中消除了前导和尾随空格。

此外,如果您想使用 LIKE 运算符,可以将查询编写为:

SELECT      [fileID],
            [fileCOde],
            [filePassword],
            [fileDescription],
            [rowguid],
            [secguid]
FROM        [dbo].[dbMobileFile]
WHERE       secguid LIKE '%3137459D-EFDE-449E-94A3-89345A8580FA%'

希望这可以帮到你!!!

这两种解决方案的性能都很差。当然,正确的解决方案是将“secguid”列实际更改为GUID。 - Magnus
@Magnus 同意。那是最好的解决方案。但是,我在回答时不知道 OP 是否有表格修改的自由(例如,如果它是一个由他人维护的 edmx 连接的实时应用程序)。就问题而言,如何使用 WHERE 子句获取结果,这样做就可以了(虽然不是最好的解决方案,我完全同意)。 - Satwik Nadkarny

-1

查看数据库内的GUID值存储为32个十六进制数字:00000000000000000000000000000000,因此如果我们通过由连字符分隔的32个十六进制数字进行搜索:00000000-0000-0000-0000-000000000000,则不会得到任何输出。


-1

我曾经遇到过一个损坏的数据库问题。在WHERE子句中包含了一些GUID,而同一张表中的其他GUID却无法返回结果。

事实证明,这是由于数据库存在索引问题。运行DBCC以确保您的数据库没有损坏。


-1

被接受的答案有效,但比较啰嗦,可能不是预期的实现方法。UniqueIdentifier 是由 {} 限定的,因此以下是最简单的方式:

SELECT * FROM dbMobileFile WHERE secguid = '{3137459D-EFDE-449E-94A3-89345A8580FA}'

-3

试试这个:

SELECT * FROM dbMobileFile WHERE secguid = ('3137459D-EFDE-449E-94A3-89345A8580FA')

使用括号将GUID字符串括起来,例如:('GUID')


没有效果。请使用上面提到的“CAST”解决方案。 - Robert N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接