2

ユーザーは、スキームのIDまたはスキームの名前のいずれかでスキームへの参照を送信できます。指定されたスキームが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'

(列schemeiduniqueidentifierテーブルのaですSCHEMES)。

これは、auniqueidentifierが送信されたときに正常に機能します。しかし、名前が送信されると(たとえば@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'

どんなアイデアでも大歓迎です。前もって感謝します。

4

2 に答える 2

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
于 2012-08-14T20:37:42.897 に答える
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'
于 2012-08-14T19:31:35.687 に答える