2012-08-14 42 views
2

允許用戶通過scheme的id或scheme的名稱發送對scheme的引用。如果給定方案在記錄中作爲ID或名稱找到,則數據有效。臨時表...在TSQL中處理模棱兩可的varchar(uniqueidentifier或不)時,轉換失敗

CREATE TABLE #ModelsForScheme( 
[modelid] uniqueidentifier, 
[schemeid] VARCHAR (36)) 

臨時表後來被填充。我現在有什麼...

DECLARE @XMLScheme VARCHAR (36) 
SET @XMLScheme = (SELECT TOP 1 schemeid FROM #ModelsForScheme) --there will only be one row 

DECLARE @SchemeID VARCHAR (36) 
SELECT @SchemeID=schemeid FROM SCHEMES WHERE [email protected] 
IF @SchemeID IS NULL 
    SELECT @SchemeID=schemeid FROM SCHEMES WHERE [name][email protected] 

IF @SchemeID IS NULL 
    SELECT 'Scheme is NULL' 

(列schemeid是表SCHEMES一個uniqueidentifier)。

這可以很好地發送uniqueidentifier。但是,當發送名稱時(例如@XMLScheme = 'dog'),我收到以下錯誤;

將字符串轉換爲uniqueidentifier時轉換失敗。

我試圖CASTCONVERT,但我不能讓他們的工作。如果我保證這只是SCHEMES中的一個方案,我可以讓它起作用,但事實並非如此。

SET @XMLSchemeID = (SELECT TOP 1 schemeid FROM #ModelsForScheme) 
SET @SchemeID= (SELECT TOP 1 schemeid FROM SCHEMES) 
IF @XMLSchemeID<>@SchemeID 
    Select 'yeaaaaa no error' 

任何想法表示讚賞。提前致謝。

回答

1

使用以下IF來檢查@XMLScheme是否爲uid或字符串。因爲

.... WHERE [email protected] 

確實從varchar(36)uniqueidentifier的隱式類型轉換上@XMLScheme

您可以測試是否@XMLScheme是一個有效的uniqueidentifier執行查詢之前

DECLARE @XMLScheme VARCHAR (36) 
SET @XMLScheme = (SELECT TOP 1 schemeid FROM #ModelsForScheme) --there will only be one row 

DECLARE @SchemeID VARCHAR (36) 

IF @XMLScheme like replace('00000000-0000-0000-0000-000000000000','0','[a-fA-F0-9]') 
    SELECT @SchemeID=schemeid FROM SCHEMES WHERE [email protected] 
ELSE 
    SELECT @SchemeID=schemeid FROM SCHEMES WHERE [name][email protected]; 


IF @SchemeID IS NULL 
    SELECT 'Scheme is NULL' 
+0

從問題「(該列的schemeid是表SCHEMES中的uniqueidentifier)」,所以它不是一個數字。 – 2012-08-14 20:47:21

+0

修復了一個類似的語句來檢查它是否爲uid。 – valex 2012-08-14 21:39:16

2

您的查詢失敗。

if (@XMLScheme like '________-____-____-____-____________' and patindex('%[^-0-9A-F]%', @XMLScheme) = 0) 
    SELECT @SchemeID=schemeid FROM SCHEMES WHERE [email protected] 
相關問題