Неожиданный 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>