我有以下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))))
但它给了我错误的字符串......
有人可以帮我吗?
谢谢!
答案 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。