【问题标题】:Conversion failed when converting from a character string to uniqueidentifier. in SQL从字符串转换为唯一标识符时转换失败。在 SQL 中
【发布时间】:2015-02-11 23:41:34
【问题描述】:

我有一个输入变量类型为 uniqueidentifier 的存储过程。当我执行这个存储过程时,如果我得到表中的正确值,存储过程会返回记录,但如果我给的值错误,那么存储过程不应该返回任何东西。

我收到此错误:

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

这是我的存储过程:

ALTER PROCEDURE [dbo].[Get_Authorization_Token] 
    @Auth_Token uniqueidentifier
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        Customer_ID, Auth_Token, Token_Expiration 
    FROM
        Authorization_Token
    WHERE
        Auth_Token = @Auth_Token 
        AND GETDATE() < Token_Expiration 
 END

我不知道为什么冻结我的帖子!!

我已经尝试过这样的 CAST:

CAST(Auth_Token as uniqueidentifier)

但我得到同样的错误。

【问题讨论】:

  • 您忘记指出auth_token 列是什么数据类型,这是这个问题的关键。

标签: sql sql-server


【解决方案1】:

我将在这里冒险,并说您表中的 auth_token 列是一个 varchar(或 nvarchar),并且其中的一个值不是有效的 guid。因此,当您进行搜索时,它会尝试(但失败)将该列中的值转换为 guid。

您可以将传入的 guid 转换为字符串,以便它匹配列的数据类型,当然知道它永远不会匹配那些无效的字符串。

这是发生了什么的插图

if object_id('tempdb.dbo.#test') is not null drop table #test
create table #test
(
    AuthToken char(36)
)

insert into #Test
select cast(newid() as varchar(36)) union all --this is fine
select 'Not a guid' --this is not

declare @authtoken uniqueidentifier = newid()

select *
from #test
where AuthToken = @authtoken

要解决此问题,您可以重构 select 语句以将 @authtoken 转换为如下字符串:

select *
from #test
where AuthToken = cast(@authtoken as char(36))

如果你有 SQL Server 2012,你也可以在列上使用 try_convert

select *
from #test
where try_convert(uniqueidentifier, AuthToken) = @authtoken 

编辑:这是我编写的一些代码,用于测试字符串是否为 GUID。我很可能不会在生产系统中使用它,但它可以帮助您根除无效字符串。

declare @testGUID char(36) = newid(),
@guidPattern varchar(1000) =
    replicate('[0-9A-Fa-f]', 8) 
    + '-' 
    + replicate('[0-9A-Fa-f]', 4) 
    + '-' 
    + replicate('[0-9A-Fa-f]', 4) 
    + '-'
    + replicate('[0-9A-Fa-f]', 4) 
    + '-'
    + replicate('[0-9A-Fa-f]', 12)


if @testGUID like @guidPattern
    select 'ITS A GUID!'
else
    select 'OH NOES'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多