我需要从SQL中的下面的字符串中提取 P4534 。这两个时期之间的长度可能会发生变化。因此,我需要在执行子字符串时考虑这两个时期之间的更长字符串。我怎样才能从不同的位置开始?
<?xml version="1.0" encoding="utf-8"?><mydata>9.9.P4534.2.3</mydata>
答案 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