MS SQL Server 2008 charindex在char字符串字段

时间:2016-08-18 21:53:12

标签: sql-server sql-server-2008 split charindex patindex

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

我想弄清楚如何拆分字符串值之间有两个空格的字段。

示例字段内容

'AFLOP  46.95  46.95  36.95  0  0  '

当再次使用table varchar字段时,charindex和patindex都返回0,但如果我声明了varchar(max)变量并使用它进行测试,则返回位置。

我无法弄清楚如何使用table 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

这不起作用,为每个记录字符串值返回0&#strong>

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

任何人都知道为什么?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:-1)

我弄清楚了:&#39;空格&#39;不是空格,而是 cr lf - 即CHAR(13)CHAR(10)

这符合预期:

Select patindex(cast('%'+CHAR(13)+CHAR(10)+'%' as varchar(max)),BEFORE) from SECAUDIT

Select charindex(CHAR(13)+CHAR(10),SECAUDIT.BEFORE) from SECAUDIT