1

このようなxmlを格納する列を持つSQLテーブルがあります

<AdditionalInfo><RegistrantID>16279</RegistrantID></AdditionalInfo>

次のようなストアドプロシージャを作成しました。

CREATE PROC hr_GetJobStatusByRegistrantId

@registrantId VARCHAR
AS  
BEGIN  
SELECT TOP 1 
      [IsSubscribed]
  FROM [Hrge].[dbo].[hr_Jobs]
  where AdditionalInfo LIKE  '%<AdditionalInfo><RegistrantID>%' + @registrantId + '%</RegistrantID></AdditionalInfo>%'

  END

このストアドプロシージャを実行すると、nullが発生します。

 exec hr_GetJobStatusByRegistrantId '16279' 

このパラメータを整数にすると、intエラーへの変換が発生します。

これに対する解決策を教えてください。

4

1 に答える 1

0

(コメントを回答に展開するだけです)


デフォルトのキックをしない限り、常に char または varchar フィールドの幅を指定する必要があります。ドキュメントには次のように記載されています。

データ定義または変数宣言ステートメントで n が指定されていない場合、デフォルトの長さは 1 です。CAST 関数および CONVERT 関数を使用するときに n が指定されていない場合、デフォルトの長さは 30 です。

つまり、あなたの場合、実際に定義@registrantIdしたVARCHAR(1)ので、「16279」の値が1文字(「1」)にトリミングされ、実際に検索したことを意味します

%<AdditionalInfo><RegistrantID>%1%</RegistrantID></AdditionalInfo>%

データベースで。これは、実際には、フィールドのどこかに「1」がある DB で見つかった最初のレコードの IsSubscribed フラグを返しました RegistrantID。値が間違っていたのは幸運だったので、それに気付きました。

さらに、パラメータの周りに % を使用しています。これは、123 の a を検索すると RegistrantID、123、1234、2123、51236 などの結果が得られることを意味し、最初の 1 つだけを取得します。注文条項なし)。完全一致が必要だと思うので、それらを削除して、単に使用する必要があります

'%<AdditionalInfo><RegistrantID>' + @registrantId
                                           + '</RegistrantID></AdditionalInfo>%'

また、それRegistrantIdは実際には数値であり、プロシージャのインターフェースがそれを反映していればいいので、次のように定義できます

@registrantId int

次に、クエリで文字列に変換されます

'%<AdditionalInfo><RegistrantID>' + cast(@registrantId as varchar(10))
                                           + '</RegistrantID></AdditionalInfo>%'
于 2013-03-06T09:26:45.643 に答える