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

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

示例字段内容

'AFLOP  46.95  46.95  36.95  0  0  '

当再次使用表 varchar 字段时,charindex 和 patindex 都返回 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 回答
-1

我想通了:“空格”不是空格,而是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
于 2016-08-18T22:22:37.100 回答