Неожиданный XML-элемент «_x0078_ml» в Babelfish

      create table #emp
(
id int,
name varchar(10)
);
insert into #emp values(1,'A'),(2,'B');

create table #prd
(
prid int,
price int
);
insert into #prd values(1,299),(2,295);

Ожидаемый результат: я хочу отобразить результат, как показано ниже.

      <SampleData>
    <EmpData id="1" name="A" />
    <EmpData id="2" name="B" />
    <PrdData prid="1" price="299" />
    <PrdData prid="2" price="295" />
</SampleData>

Запрос:

      SELECT 
(
    SELECT 
    (
        SELECT id,
               name 
        FROM #emp
        FOR XML RAW('EmpData'),TYPE 
    ),
    (
        SELECT prid,
               price
        FROM #prd
        FOR XML RAW('PrdData'),TYPE
    )
    FOR XML PATH('SampleData'),TYPE
);

Выход:

      <SampleData>
  <_x0078_ml>
    <EmpData id="1" name="A" />
    <EmpData id="2" name="B" />
  </_x0078_ml>
  <_x0078_ml>
    <PrdData prid="1" price="299" />
    <PrdData prid="2" price="295" />
  </_x0078_ml>
</SampleData>

Примечание . Запрос отлично работает в SQL Server, но не получает дополнительный XML-элемент _x0078_ml в Babelfish. Мне нужно, чтобы этот запрос был совместим как с SQL Server, так и с Babelfish.

3 ответа

ИспользоватьFOR XML PATHвместо этого и явно укажите имена атрибутов.

      SELECT 
(
    SELECT 
    (
        SELECT id AS [@id],
               name AS [@name]
        FROM #emp
        FOR XML PATH('EmpData'),TYPE 
    ),
    (
        SELECT prid AS [@prid],
               price AS [@price]
        FROM #prd
        FOR XML PATH('PrdData'),TYPE
    )
    FOR XML PATH('SampleData'),TYPE
);

Альтернативно используйтеFOR XML AUTO, хотя при этом сложнее контролировать точную форму XML.

      SELECT 
(
    SELECT 
    (
        SELECT id,
               name 
        FROM #emp AS EmpData
        FOR XML AUTO,TYPE 
    ),
    (
        SELECT prid,
               price
        FROM #prd AS PrdData
        FOR XML AUTO,TYPE
    )
    FOR XML PATH('SampleData'),TYPE
);

БД<>скрипка

Пробовали ли вы использовать псевдонимы подзапросов xml с помощью node() или * ?

      SELECT 
(
    SELECT id,
           name 
    FROM #emp
    FOR XML RAW('EmpData'),TYPE 
)[node()],
(
    SELECT prid,
           price
    FROM #prd
    FOR XML RAW('PrdData'),TYPE
)[*]

Как уже сказал @Charlieface, это похоже на ошибку в Babelfish.

Кажется, что это добавляет искусственный<_x0078_ml>корневой элемент в подзапросах.

Пожалуйста, попробуйте обходной путь ниже.

Основная идея — ввести этап постобработки через XQuery для удаления ненужных корневых элементов подзапросов.

SQL

      -- DDL and sample data population, start
DECLARE @emp table (id int, name varchar(10));
INSERT @emp values(1,'A'),(2,'B');

DECLARE @prd TABLE (prid int, price int);
INSERT @prd values(1,299),(2,295);
-- DDL and sample data population, end

SELECT (
SELECT 
(
    SELECT id AS [@id],
        name AS [@name]
    FROM @emp
    FOR XML PATH('EmpData'),TYPE, ROOT('root') 
),
(
    SELECT prid AS [@prid],
        price AS [@price]
    FROM @prd
    FOR XML PATH('PrdData'),TYPE, ROOT('root') 
)
FOR XML PATH(''),TYPE, ROOT('SampleData')
).query('<SampleData>
{
    for $x in /SampleData/root/*
    return $x
}
</SampleData>');

Выход

      <SampleData>
  <EmpData id="1" name="A" />
  <EmpData id="2" name="B" />
  <PrdData prid="1" price="299" />
  <PrdData prid="2" price="295" />
</SampleData>
Другие вопросы по тегам