在SQL查询中为uniqueidentifier显示转换失败错误

时间:2016-07-28 05:46:07

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

我有一个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'

错误显示为

  

从字符串转换为uniqueidentifier

时转换失败

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

1 个答案:

答案 0 :(得分:1)

根据Microsoft文档:

  

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