-1
Select charindex('%  %',CAST(X.MyCharStringField AS NVARCHAR(max))) from X

文字列値の間に 2 つのスペースがあるフィールドを分割する方法を考えています。

フィールド コンテンツの例

'AFLOP  46.95  46.95  36.95  0  0  '

charindex と patindex はどちらも、テーブルの varchar フィールドを再度使用すると 0 を返しますが、varchar(max) 変数を宣言してそれでテストすると位置を返します。

テーブル varchar(max) フィールドでこれを機能させる方法がわかりません。

この作品

Declare @theBefore varchar(100)
SET @theBefore = 'AFLOP  46.95  46.95  36.95  0  0  '
select charindex(' ',@theBefore) as spaceIndex,SUBSTRING(@theBefore,0,6)as ITEM_ID
,ltrim(rtrim(SUBSTRING(@theBefore,charindex(' ',@theBefore),len(@theBefore)+2))) as BEFORE

これは機能しません。各レコードの char 文字列値に対して 0 を返します

Select charindex('%  %',CAST(X.MyCharStringField AS NVARCHAR(max))) from X

誰でも理由がわかりますか?

4

2 に答える 2

0

文字列を分割するこの簡単な方法を試すことができます: 空白を置き換えて</x><x>、開始タグを開始タグに追加し、終了タグを最後に追加します。- XML があります:

DECLARE @YourString VARCHAR(MAX)='AFLOP  46.95  46.95  36.95  0  0  ';

SELECT part.value('.','varchar(max)')
FROM
(
    SELECT CAST('<x>' + REPLACE(@YourString,'  ','</x><x>') + '</x>'  AS XML)
) AS tbl(Casted)
CROSS APPLY Casted.nodes('/x') AS A(part)

アップデート

入力文字列が常に同じ構造を持っている場合は、より簡単に、タイプセーフで直接値を取得できます。

DECLARE @YourString VARCHAR(MAX)='AFLOP  46.95  46.95  36.95  0  0  ';

SELECT Casted.value('/x[1]','varchar(max)') AS part1
      ,Casted.value('/x[2]','decimal(6,2)') AS part2
      ,Casted.value('/x[3]','decimal(6,2)') AS part3
      ,Casted.value('/x[4]','decimal(6,2)') AS part4
      ,Casted.value('/x[5]','decimal(6,2)') AS part5
      ,Casted.value('/x[6]','decimal(6,2)') AS part6

FROM
(
    SELECT CAST('<x>' + REPLACE(@YourString,'  ','</x><x>') + '</x>'  AS XML)
) AS tbl(Casted)
于 2016-08-18T22:00:11.550 に答える