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
任何人都知道为什么?
答案 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