【问题标题】:XML - Extract after a String and before a certain characterXML - 在字符串之后和某个字符之前提取
【发布时间】:2018-06-27 17:38:48
【问题描述】:

我有以下 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))))

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

谁能帮帮我?

谢谢!

【问题讨论】:

  • 向我们展示发生的错误
  • 传递给子字符串函数的长度参数无效。
  • 此错误是由于将负值传递给 SUBSTRING、LEFT 和 RIGHT 字符串函数的长度参数引起的。为避免此错误,请始终确保将非负值传递给 SUBSTRING、LEFT 和 RIGHT 函数的长度参数。

标签: sql xml tsql substring


【解决方案1】:

您的第一行不太清楚(但您已将其标记为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。

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 2018-08-21
    • 2015-06-06
    • 1970-01-01
    • 2022-08-18
    • 2012-01-14
    • 1970-01-01
    • 2022-11-23
    • 2019-07-08
    相关资源
    最近更新 更多