Вставьте или сохраните XML-файл, созданный с помощью XML-ПУТИ, содержащего пространства имен

#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. Спасибо вам за подробный ответ. Это решило мою проблему.