Можно ли задать элемент ROOT в выражении select с использованием FOR XML PATH с использованием переменной?

У меня есть запрос, который создает файл xml. В настоящее время у меня есть элемент ROOT с жестким кодированием. Я хотел бы использовать значение переменной для установки этого значения корневого элемента, но подставляя стробированную строку переменной, выдает синтаксическую ошибку expecting a string . Это оператор select:

 DECLARE @SelectResults XML DECLARE @DatabaseName varchar(100) SELECT @DatabaseName = DB_NAME(); SET @SelectResults = ( SELECT...query results here... FOR XML PATH(''), ROOT(@DatabaseName) --when this is set to 'DatabaseName' it works ) 

Могу ли я использовать переменную в функции ROOT() ?

Вы можете сделать замену в отдельной замене, действующей на выходе XML:

 DECLARE @SelectResults XML DECLARE @DatabaseName varchar(100) SELECT @DatabaseName = DB_NAME(); SET @SelectResults = replace( SELECT...query results here... FOR XML PATH(''), ROOT('ROOT_ELEMENT') --when this is set to 'DatabaseName' it works ), 'ROOT_ELEMENT>',@DatabaseName+'>' ) 

Вот немного обманывать, используя concat ()

Создание выборочных данных

 Declare @SomeTable table (id int,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50)) Insert into @SomeTable values (1,'John','Smith','[email protected]'), (2,'Jane','Doe' ,'[email protected]') 

SQL

 Declare @SelectResults XML = concat('<',DB_NAME(),'>',(Select * from @SomeTable for XML Path),'</',DB_NAME(),'>') Select @SelectResults 

Возвращает

 <Chinrus-Dev> <row> <id>1</id> <First_Name>John</First_Name> <Last_Name>Smith</Last_Name> <EMail>[email protected]</EMail> </row> <row> <id>2</id> <First_Name>Jane</First_Name> <Last_Name>Doe</Last_Name> <EMail>[email protected]</EMail> </row> </Chinrus-Dev> 

Нет, вы не можете сделать это ad-hoc

Эта

 SELECT 'test' FOR XML PATH('x'),ROOT('y') 

приводит к

 <y> <x>test</x> </y> 

Но это не разрешено

 DECLARE @root NVARCHAR(MAX)='z'; SELECT 'test' FOR XML PATH('x'),ROOT(@root) <-- error! 

динамический SQL

Вы можете построить динамическое утверждение

 DECLARE @root NVARCHAR(MAX)='z'; DECLARE @cmd NVARCHAR(MAX)= ( 'SELECT ''test'' FOR XML PATH(''x''),ROOT(''' + @root + ''')' ); EXEC(@cmd); 

приводит к

 <z> <x>test</x> </z> 

Но – как всегда – динамический SQL имеет некоторые тяжелые обратные спины …

  • Сохраненная процедура с данными xml
  • Как сгладить последовательность листьев дерева в SQL
  • Является ли @mp: id всегда в порядке XML Doc?
  • SqlBulkCopy не пытается скопировать строку с большим содержимым в столбце XML
  • Как обновить таблицу на основе XML-параметра
  • FOR XML SQL Server - имя переменной в выводе XML
  • Элемент формы xml из таблицы SQL Server
  • Как преобразовать XML-поле с более чем 8000 символами в строку?
  • Запрос Xpath SQL Server
  • Как добавить атрибуты в существующую строку xml, сохраненную как поле из остальных столбцов в той же строке, используя SQL
  • получать значения, разделенные запятыми, из данных xml
  • Interesting Posts

    Удалите дубликаты из списка, но сохраните их номера счета

    Как сопоставить (и настроить) круговую ссылку в NHibernate?

    Выбор отдельных записей из таблицы

    Обновление строк MS SQL с использованием @values

    Применять предложение WHERE условно в SQL-запросе

    Sql – НЕ В сочетании

    Поиск строк с двойными кавычками в SQL Server

    SQL Проверка дублированного имени пользователя в таблице

    Как скопировать базу данных SQL Azure на локальный сервер разработки?

    Преобразование Varchar в DateTime – Varchar не имеет персонажа для разделения частей даты

    SQL Azure – как измерить текущую рабочую нагрузку, чтобы оценить, когда произойдет дросселирование

    CREATE ASSEMBLY терпит неудачу с «Невозможно разрешить токен»

    Как скопировать схему и некоторые данные из SQL Server в другой экземпляр?

    выберите максимальное значение в каждых 5 строках

    sql, где ActionID в случае x = 0, тогда id в (1,2,3,4), когда x = 1, тогда id в (1,2), когда x = 2 id в (3,4)

    Давайте будем гением компьютера.