#sql #sql-server #tsql #for-xml-path
Вопрос:
Я создаю XML с XML-ПУТЕМ, который имеет 6 пространств имен. Есть схема, и поэтому я не могу изменить структуру XML.
WITH XMLNAMESPACES ('NS1' AS ns1,
'NS2' AS ns2,
'NS3' AS ns3,
'NS4' AS ns4,
'NS5' AS ns5,
'NS6' AS ns6)
SELECT(SELECT 'something' AS 'ns3:node2' FOR XML PATH('ns2:Node1'), TYPE)
FOR XML PATH(''),
ROOT('ns1:RootNode');
Теперь мне нужно либо вставить выходные данные в таблицу tmp, либо сохранить их в переменной. Проблема, с которой я застрял, заключается в том, что с потребностями a ; перед ним. Так Set @myVariable = above Codeblock
что и то и insert into tmp table values(above codeblock)
другое не работает, и мне интересно, есть ли способ сохранить это. XML действителен и работает нормально, если я посмотрю на него или сохраню его на жестком диске, но мне нужно еще немного поработать с этим XML.
Комментарии:
1. «Проблема, с которой я застрял, заключается в том, что у меня есть потребности». Что это вообще значит?
2. Извините, что это предложение является очень короткой версией сообщения об ошибке: Неправильный синтаксис рядом с ключевым словом WITH. Если этот оператор является общим табличным выражением, предложением XMLNAMESPACES или предложением КОНТЕКСТА ОТСЛЕЖИВАНИЯ ИЗМЕНЕНИЙ, предыдущий оператор должен заканчиваться точкой с запятой.
3. «предыдущее утверждение должно заканчиваться точкой с запятой». Там @InCo совершенно ясно ; правильно завершите все свои утверждения (как вы уже должны делать).
Ответ №1:
Вам нужно поместить все свое целое SELECT
в следующий подзапрос. Итак, для вставки:
DECLARE @T TABLE (X XML);
WITH XMLNAMESPACES ('NS1' AS ns1,
'NS2' AS ns2,
'NS3' AS ns3,
'NS4' AS ns4,
'NS5' AS ns5,
'NS6' AS ns6)
INSERT @T (X)
SELECT (SELECT (SELECT 'something' AS 'ns3:node2' FOR XML PATH('ns2:Node1'), TYPE)
FOR XML PATH(''),
ROOT('ns1:RootNode'));
SELECT * FROM @T;
Или назначить переменную:
DECLARE @X XML;
WITH XMLNAMESPACES ('NS1' AS ns1,
'NS2' AS ns2,
'NS3' AS ns3,
'NS4' AS ns4,
'NS5' AS ns5,
'NS6' AS ns6)
SELECT @X= (SELECT (SELECT 'something' AS 'ns3:node2' FOR XML PATH('ns2:Node1'), TYPE)
FOR XML PATH(''),
ROOT('ns1:RootNode')
);
SELECT @X;
Комментарии:
1. Спасибо вам за подробный ответ. Это решило мою проблему.