在句点分隔符之间提取字符串

时间:2015-08-07 18:01:42

标签: sql sql-server-2005

我需要从SQL中的下面的字符串中提取 P4534 。这两个时期之间的长度可能会发生变化。因此,我需要在执行子字符串时考虑这两个时期之间的更长字符串。我怎样才能从不同的位置开始?

<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4534.2.3</mydata>

2 个答案:

答案 0 :(得分:0)

AT()函数返回一个整数,表示字符表达式的第一个字符的位置。

STORE '9.9.P4534.2.3' TO gcString
STORE 'P4534' TO gcFindString
SUBSTRING(gcString, AT(gcFindString,gcString), 5)

答案 1 :(得分:0)

给它一个旋转。它是XML格式的,因此您可以利用xQuery获取<mydata>的值,然后替换每个&#39;。&#39;使用<M>标记,然后再次使用xQuery将结果集推送到表中,并将第3行作为值。

DECLARE @STRING VARCHAR(1000)
SET @STRING = '<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4534.2.3</mydata>'
--SET @STRING = '<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4456789534.2.3</mydata>'

DECLARE @XML TABLE (val VARCHAR(1000))
INSERT INTO @XML(val) SELECT @STRING

DECLARE @PARTS TABLE (id int identity(1,1), val VARCHAR(1000))

INSERT INTO @PARTS (val)
SELECT Split.a.value('.', 'VARCHAR(max)') AS String
FROM  
(
    SELECT CAST ('<M>' + REPLACE(CAST(Split.B.value('.', 'VARCHAR(max)') AS VARCHAR), '.', '</M><M>') + '</M>' AS XML) AS String
    FROM  (SELECT CAST(val AS XML) AS String  
           FROM @XML) AS B 
    CROSS APPLY String.nodes ('/mydata') AS Split(B)
) AS A 
CROSS APPLY String.nodes ('/M') AS Split(a)

SELECT val
FROM @PARTS
WHERE id=3