2015-02-11 591 views
0

我有一個存儲過程,輸入變量是類型uniqueidentifier。當我執行這個存儲過程時,如果我得到表中正確的值,那麼存儲過程將返回記錄,但是如果我給出的值錯誤,那麼存儲過程不應返回任何內容。從字符串轉換爲uniqueidentifier時轉換失敗。在SQL中

我得到這個錯誤:

Conversion failed when converting from a character string to 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) 

,但我得到同樣的錯誤。

+0

您忘記指出'auth_token'列的數據類型,這是此問題的關鍵。 – 2016-11-19 09:59:01

回答

1

我打算在這裏出去走一走,說你表中的auth_token列是一個varchar(或nvarchar),並且那裏的一個值不是有效的guid。因此,當您執行搜索時,它試圖(和失敗)將該列中的值轉換爲guid。

您可以將您的傳入guid轉換爲字符串,以便它匹配列的數據類型,知道cousre,它永遠不會匹配那些無效的字符串。

這裏是發生了什麼事情

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。我probalby不會在生產系統中使用它,但它可以幫助您找出無效的字符串。

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' 
相關問題