Изменение вывода XML
Я сгенерировал XML следующим образом, за исключением тега, который я выделил красным.
Как я могу добавить следующую строку, помеченную красным к
Accounts
tag: ba.cbbh.crr.retail, чтобы он выглядел так, как указано на фотографии выше? (Теперь это выглядит так)Учтите, что я должен избегать синтаксических ошибок XML, таких как пробел, но сохранять пробел после учетных записей.
(
<Accounts xmlns="ba.cbbh.crr.retailba.cbbh.crr.retail">
)
Я пробовал это, но ничего не меняется...
DECLARED ALL...
SET @ACCOUNTTYPE = 'T';
SET @kodBanke = ( SELECT vrednost FROM dbini WHERE IDENT = 'KOD' AND SECTION = 'PP' );
SET @XML_info = '<?xml version="1.0" encoding="UTF-8"?>';
SET @xmlnsDodatak = 'ba.cbbh.crr.retail';
IF (@tabelaTipaRacuna = 'istdev')
BEGIN
SELECT @SQL = 'WITH Ent_Posta
AS
(
SELECT e.naziv,p.posta,e.sifra
FROM entitet AS e
INNER JOIN poste AS p ON e.sifra = p.entitet
)
SELECT [dbo].[brojracuna](' + @kodBanke + ',i.partija) AS ''AccountNo/BBAN'',
[dbo].[GENERATEIBAN](i.partija) AS ''AccountNo/IBAN'',
' + '''D''' + ' AS ''AccountType'',
(a.ime + ''('' + a.roditel + '')'' + a.prezime) AS ''Name'',
a.embg AS ''UID'',
CASE status
WHEN 2 THEN ''A''
WHEN 4 THEN ''B''
WHEN 8 THEN ''U''
END AS ''Status'',
c.sifra AS ''Territory'',
' + @kodBanke + ' as ''ID_Bank'',
CONVERT(DATETIME,' + 'i.dotvoranje' + ',120) AS ''OpeningDate'',
ISNULL(CONVERT(DATETIME,' + '1' + ',120),'''') AS ''ClosingDate''
FROM adresar AS a
INNER JOIN' + QUOTENAME(@tabelaTipaRacuna) + ' AS i
ON a.embg = i.embg
INNER JOIN Ent_Posta as c
ON a.postbroj = c.posta
FOR XML PATH(''Account''), ROOT(''Accounts'')'
SELECT @SQL = REPLACE(@SQL, '''<Accounts>''', '''<Accounts xmlns="' + @xmlnsDodatak + '">''')
SELECT @SQL
EXEC(@SQL)
Решение:
Это то, что сработало для меня...
...'WITH XMLNAMESPACES(DEFAULT ''ba.cbbh.crr.retail''), Ent_Posta
AS
(
SELECT e.naziv,p.posta,e.sifra
FROM entitet AS e
INNER JOIN poste AS p ON e.sifra = p.entitet
)...
... INNER JOIN Ent_Posta as c
ON a.postbroj = c.posta
FOR XML PATH(''Account''), ROOT(''Accounts'')'...
Редактировать:
Теперь я хочу это:
После небольшого исследования я понял, что это должно выглядеть примерно так:
...SELECT @SQL = 'SELECT ''<?xml version=""1.0"" encoding=""UTF-8""?>''' + ''
'WITH XMLNAMESPACES(DEFAULT ''ba.cbbh.crr.retail''), Ent_Posta
AS
(
SELECT e.naziv,p.posta,e.sifra
FROM entitet AS e
INNER JOIN poste AS p ON e.sifra = p.entitet
) ...
Видимо, это не сработает. Что не так с этим?
1 ответ
Это пространство имен по умолчанию. Так что следуйте этому примеру:
Указание пространств имен по умолчанию Вместо того, чтобы объявлять префикс пространства имен, вы можете объявить пространство имен по умолчанию, используя ключевое слово DEFAULT. В запросе FOR XML он свяжет пространство имен по умолчанию с узлами XML в результирующем XML. В следующем примере WITH XMLNAMESPACES определяет два префикса пространства имен, которые определяются вместе с пространством имен по умолчанию.
WITH XMLNAMESPACES ('uri1' as ns1,
'uri2' as ns2,
DEFAULT 'uri2')
SELECT ProductID,
Name,
Color
FROM Production.Product
WHERE ProductID=316 or ProductID=317
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS
Добавьте пространства имен в запросы с помощью WITH XMLNAMESPACES
У вас есть CTE, и в сочетании с XMLNAMESPACES это будет выглядеть так:
WITH XMLNAMESPACES ('uri1' as ns1,
'uri2' as ns2,
DEFAULT 'uri2'),
q as
(
SELECT ProductID,
Name,
Color
FROM Production.Product
WHERE ProductID=316 or ProductID=317
)
select *
from q
FOR XML RAW ('ns1:Product'), ROOT('ns2:root'), ELEMENTS