允许用户通过方案的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时转换失败。
我尝试了CAST
和CONVERT
,但我无法让它们发挥作用。如果我得到保证,SCHEMES
中只有一个方案可以让它工作,但事实并非如此。
SET @XMLSchemeID = (SELECT TOP 1 schemeid FROM #ModelsForScheme)
SET @SchemeID= (SELECT TOP 1 schemeid FROM SCHEMES)
IF @XMLSchemeID<>@SchemeID
Select 'yeaaaaa no error'
任何想法都表示赞赏。提前谢谢。
答案 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'