0

2 つの値の間のストリントの一部を選択しようとしています。約 90% まで動作させることができましたが、エラーが発生しました -

SUBSTRING(TranText, CHARINDEX('x', TranText) + 1, LEN(TranText) - CHARINDEX('x', TranText) - CHARINDEX('/', REVERSE(TranText)))

クエリしているフィールドは次のようになります

開始日 : 2013 年 1 月 2 日 50 x 156.00/MX + 207.64

望ましい結果は

156.00

問題は、X の前後にスペースがあったり、スペースがまったくなかったりすることがあるからだと思います。投げる前に約114,000行を通過します

LEFT または SUBSTRING 関数に無効な長さパラメーターが渡されました。

しかし、解決するのに苦労しています。

4

2 に答える 2

2

主な根本原因は、LEN(@QRY) - CHARINDEX('x', @QRY)-CHARINDEX('/', REVERSE(@QRY))がゼロより小さい、つまり負の値である可能性があります。SUBSTRINGSUBSTRING の最小インデックスがゼロであるため、これによりエラーがスローされます。したがって、case ステートメントでその条件をチェックします。

SELECT CASE WHEN LEN(TranText) - CHARINDEX('x',TranText)-CHARINDEX('/', REVERSE(TranText)) >= 0 THEN
SUBSTRING(TranText, CHARINDEX('x', TranText) + 1, LEN(TranText) - CHARINDEX('x', TranText) - CHARINDEX('/', REVERSE(TranText)))
ELSE NULL END
FROM YOURTABLE
于 2015-01-30T11:28:43.297 に答える
1

これを試して。関数を使用REPLACEしてから解析しました。

DECLARE @string AS VARCHAR(100),  @result AS VARCHAR(100)
DECLARE @nStart AS int

SET @string = 'Start Date : 01/02/2013 50 x 156.00/MX + 207.64'
SET @result = REPLACE(@string, '/', '')
SET @nStart = CHARINDEX('x', @result) + 1
SET @result = SUBSTRING(@result, @nStart, CHARINDEX('M',@result) - @nStart)

SELECT @result
于 2015-01-30T11:20:43.100 に答える