XML - 在String之后和某个字符之前提取

时间:2018-01-18 15:31:02

标签: sql xml tsql substring

我有以下XML代码:

_RCFM*=.·<form><text id="NomeTransporteSAP" label="JOB: *" mandatory="true" multiline="true" readonly="false" visible="true">AA123EDC/NB: Cheque holding v05  TESTE PT 223427</text>

我正在尝试创建一个允许我获取ID的声明:AA123EDC

为此我正在使用:

SUBSTRING(col1, LEN(SUBSTRING(col1, 0, LEN(col1) - CHARINDEX ('DSI Request Number', col1))) + 1, 
            LEN(col1) - LEN(SUBSTRING(col1, 0, LEN(col1) - CHARINDEX ('DSI Request Number', col1))) 
            - LEN(SUBSTRING(col1, CHARINDEX ('</text><text id=', col1), LEN(col1))))

但它给了我错误的字符串......

有人可以帮我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

你的第一行很不清楚(但你用tsql标记了它......)。您似乎想要在XML中读取值表单。此外,这个值不是原子的,所以你必须解析它。

如果我的假设是正确的,你应该这样试试:

DECLARE @YourXML XML=
N'<form>
  <text id="NomeTransporteSAP" label="JOB: *" mandatory="true" multiline="true" readonly="false" visible="true">AA123EDC/NB: Cheque holding v05  TESTE PT 223427</text>
</form>';

WITH ReadFromXML AS
(
    SELECT @YourXML.value(N'(/form/text/text())[1]',N'nvarchar(max)') AS TheValue --AA123EDC/NB: Cheque holding v05  TESTE PT 223427
)
SELECT LEFT(TheValue,CHARINDEX('/',TheValue)-1)
FROM ReadFromXML;

这将使用CTE检索派生表中的内部文本,并使用/删除以LEFT开头的所有内容。

CTE方法没有必要,但要好好阅读。

如果你的XML生活在一个表中,你可以使用相同的方法,但在这种情况下,我会使用CROSS APPLY而不是CTE。