在TSQL中处理不明确的varchar(uniqueidentifier或不是)时,转换失败

时间:2012-08-14 18:47:02

标签: sql-server tsql

允许用户通过方案的id或方案名称发送对Scheme的引用。如果在记录中找到给定方案作为id或名称,则数据有效。临时表......

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 schemeid=@XMLScheme
IF @SchemeID IS NULL
  SELECT @SchemeID=schemeid FROM SCHEMES WHERE [name]=@XMLScheme

IF @SchemeID IS NULL
  SELECT 'Scheme is NULL'

schemeid列是表uniqueidentifier中的SCHEMES。)

发送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'

任何想法都表示赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的查询失败,因为

.... WHERE schemeid=@XMLScheme

varchar(36)

上执行从uniqueidentifier@XMLScheme的隐式类型转换

您可以在执行查询之前测试@XMLScheme是否为有效uniqueidentifier

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

答案 1 :(得分:1)

使用以下IF检查@XMLScheme是否为uid或字符串。

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 schemeid=@XMLScheme
ELSE
  SELECT @SchemeID=schemeid FROM SCHEMES WHERE [name]=@XMLScheme;


IF @SchemeID IS NULL
  SELECT 'Scheme is NULL'