sql - SQL 查询中的 uniqueidentifier 显示转换失败错误

标签 sql sql-server sql-server-2008 tsql uniqueidentifier

<分区>

我有一个 SQL Server 表,其中包含 uniqueidentifier 类型的列 userid 并且列值为 9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E.

当我这样查询时:

 WHERE userid = '9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E'

查询运行成功。如果我在字符串的末尾添加额外的字符,它也可以正常工作,如下所示

WHERE userid = '9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7Eqweqweqwemmmmmmmmmm'

但问题是当我在字符串的开头添加额外的字符时,查询显示错误。

WHERE userid = 'A9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E'

错误显示如下

Conversion failed when converting from a character string to uniqueidentifier

我的问题是为什么仅在字符串开头添加字符时显示错误以及如何在存储过程中跟踪此错误

最佳答案

根据微软文档:

The uniqueidentifier type is considered a character type for the purposes of conversion from a character expression, and therefore is subject to the truncation rules for converting to a character type. That is, when character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated. See the Examples section.

这就解释了为什么在第 36 个位置之后追加字符会正常工作。

当您在 guid 前面添加字符时,您违反了 guid 的格式设置规则,然后转换失败。

在存储过程中,您可以使用 TRY_CONVERT 验证 guid。如果无法转换,它将返回 NULL:

IF TRY_CONVERT(UNIQUEIDENTIFIER,@userId) IS NULL
   BEGIN
      .... report error ...
   END

TRY_CONVERT 仅适用于 SQL Server 2012。如果您需要在转换为旧版本上的 UNIQUEIDENTIFIER 之前验证字符串,您可以使用以下代码:

IF NOT @userId LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%'
    BEGIN
          .... report error ...
    END

关于sql - SQL 查询中的 uniqueidentifier 显示转换失败错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38627956/

相关文章:

sql-server-2008 - 如何验证子查询是否正确?

sql - 如何通过sql水平显示垂直数据

MySQL按时间顺序选择 friend 的评论然后其他评论

mysql - 如何使用 SQL 合并和计算具有不同值的多行

php - 当没有返回行时从选择查询中获取预定义值

sql - SQL Server 2014 上的表格模式和 Power Pivot 模式有何区别?

sql-server - 服务器 xxxx 的 SQL Server 备份失败

sql - Order By [...] OFFSET [..] FETCH [...] 子句中的 fetch Next 和 fetch First 有什么区别?

sql-server-2008 - 如何排除 BETWEEN sql server 中的上限

sql-server - SQL Server 2008 的 EntityFramework(使用 LINQ)中基于偏移/获取的分页(实现)