【问题标题】:Conversion failed error is showing for uniqueidentifier in SQL query [duplicate]SQL 查询中的 uniqueidentifier 显示转换失败错误 [重复]
【发布时间】:2016-12-02 08:23:03
【问题描述】:

我有一个 SQL Server 表,其中包含 userid 类型的 uniqueidentifier 列,列值为 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'

错误显示为

从字符串转换为唯一标识符时转换失败

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

【问题讨论】:

  • 这个answer 可以帮到你!
  • 如果你停止将东西作为字符串传递,我怀疑一切都会容易得多。当您的存储过程需要的是唯一标识符时,它正在接受 string。那么为什么不把它作为参数类型呢?
  • 我的存储过程中有一个 uniqueidentifier 数据类型的局部变量,但是如果前端将值传递给存储过程,例如“A9EBC02CE-FA3A-4A62-A3B7-B9B6CFD33B7E”,其中包含一个额外的字符“ A" 那么如何跟踪查询错误@Damien_The_Unbeliever
  • 接收 uniqueidentifier 作为字符串可能有正当理由,例如,如果它来自 JSON 或 XML 文件。然后转换和验证必须发生在某个地方......

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


【解决方案1】:

根据微软文档:

uniqueidentifier 类型被认为是字符类型 从字符表达式转换的目的,因此是 遵守转换为字符类型的截断规则。 即当字符表达式转换为字符数据时 不同大小的类型,对于新数据来说太长的值 类型被截断。请参阅示例部分。

这就解释了为什么如果在第 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

【讨论】:

  • TRY_CONVERT 是 SQL Server 2012 中的新功能,因此使用 SQL Server 2008 的 OP 无法使用 ....
  • 我已编辑答案以涵盖 2012 年之前的 SQL Server 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多