Здесь задействованы два пространства имен.Оба без префикса, поэтому отображаются как пространство имен по умолчанию .Все значения находятся во внутреннем пространстве имен по умолчанию .Поэтому для простоты предлагаю использовать префикс для внешнего.Это позволяет вам обращаться ко всем внутренним элементам без префикса:
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01'
,'urn:cma:stp:xsd:stp.1.0' AS ns)
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'/ns:DataPDU/ns:Body/AppHdr') A(AppHdr);
Кроме того, вы можете опустить внешнее пространство имен и использовать подстановочный знак:
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01')
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'/*:DataPDU/*:Body/AppHdr') A(AppHdr);
И глубокий поиск 1012 * с двойной косой чертой в начале тоже будет работать (при условии, что в вашем XML есть только один элемент <AppHdr>
.
;WITH XMLNAMESPACES(DEFAULT 'urn:iso:std:iso:20022:tech:xsd:head.001.001.01')
SELECT AppHdr.value(N'(Fr/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,AppHdr.value(N'(To/FIId/FinInstnId/ClrSysMmbId/MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,AppHdr.value(N'(BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
FROM @Xml.nodes(N'//AppHdr') A(AppHdr);
Просто для удовольствия: это тоже работает (с данным XML,это не рекомендуется ):
SELECT @xml.value(N'(//*:Fr//*:MmbId/text())[1]','nvarchar(200)') as FR_MmbId
,@xml.value(N'(//*:To//*:MmbId/text())[1]','nvarchar(200)') as TO_MmbId
,@xml.value(N'(//*:BizMsgIdr/text())[1]','nvarchar(200)') as BizMsgIdr
И даже это работает (с данным XML это не рекомендуется ): -)
SELECT @xml.value(N'(//*:Fr)[1]','nvarchar(200)') as FR_MmbId
,@xml.value(N'(//*:To)[1]','nvarchar(200)') as TO_MmbId
,@xml.value(N'(//*:BizMsgIdr)[1]','nvarchar(200)') as BizMsgIdr
Общий совет: будьте как можно точнее.Это помогает избежать конфликтов имен и повышает производительность.