Создание таблицы HTML с SQL FOR XML

Я создаю документ HL7 Continuity Care Care (CCD), используя инструкции FOR XML в SQL Server 2008 R2.

Я сделал LOT с этим методом, но это первый раз, когда я должен представлять часть данных в таблице HTML, что вызывает у меня проблемы.

Итак, у меня есть следующая информация в таблице:

Problem | Onset | Status --------------------------------- Ulcer | 01/01/2008 | Active Edema | 02/02/2005 | Active 

и я пытаюсь сделать следующее

  Problem Onset Status   Ulcer 01/01/2008 Active   Edema 02/02/2005 Active  

Я использую этот запрос:

 SELECT p.ProblemType AS "td" , p.Onset AS "td" , p.DiagnosisStatus AS "td" FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML PATH('tr') 

И я продолжаю получать следующее:

  Ulcer2008-01-01Active   Edema2005-02-02Active  

Кто-нибудь получил совет?

 select (select p.ProblemType as 'td' for xml path(''), type), (select p.Onset as 'td' for xml path(''), type), (select p.DiagnosisStatus as 'td' for xml path(''), type) from tblProblemList p where p.PatientUnitNumber = @PatientUnitNumber for xml path('tr') 

Чтобы добавить заголовок, вы также можете использовать union all .

 select (select 'Problem' as th for xml path(''), type), (select 'Onset' as th for xml path(''), type), (select 'Status' as th for xml path(''), type) union all select (select p.ProblemType as 'td' for xml path(''), type), (select p.Onset as 'td' for xml path(''), type), (select p.DiagnosisStatus as 'td' for xml path(''), type) from tblProblemList p where p.PatientUnitNumber = @PatientUnitNumber for xml path('tr') 

Ответ Микаэля работает, но так будет:

Вместо использования FOR XML PATH (‘tr’) используйте FOR XML RAW (‘tr’), ELEMENTS. Это предотвратит конкатенирование значений и даст вам очень чистый результат. Ваш запрос будет выглядеть так:

 SELECT p.ProblemType AS td, p.Onset AS td, p.DiagnosisStatus AS td FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML RAW('tr'), ELEMENTS 

Я предпочитаю добавлять строку заголовка, используя чистую разметку, поэтому я могу немного лучше контролировать, что происходит. Полный блок кода будет выглядеть примерно так:

 DECLARE @body NVARCHAR(MAX) SET @body = N'' + N'' + CAST(( SELECT p.ProblemType AS td, p.Onset AS td, p.DiagnosisStatus AS td FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML RAW('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + N'
ProblemOnsetStatus
'

РЕДАКТИРОВАТЬ

Я хотел добавить дополнительную ценность, которую я придумал, исходя из необходимости форматирования выходной таблицы.

Псевдоним «AS td» будет создавать элементы

value

в разметке, но не потому, что он понимает, что ячейка таблицы является td. Это отключение позволяет нам создавать поддельные HTML-элементы, которые могут быть позже обновлены после выполнения запроса. Например, если бы я хотел, чтобы значение параметра ProblemType было выровнено по центру, я могу настроить имя элемента, чтобы это разрешить. Я не могу добавить стиль или class к имени элемента, поскольку он нарушает соглашения об именах псевдонимов в SQL, но я могу создать новое имя элемента, такое как tdc. Это создаст элементы value . Хотя это недопустимая разметка каким-либо образом, легко выполнить оператор replace.

 DECLARE @body NVARCHAR(MAX) SET @body = N'' + N'' + CAST(( SELECT p.ProblemType AS tdc, p.Onset AS td, p.DiagnosisStatus AS td FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML RAW('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + N'
ProblemOnsetStatus
' SET @body = REPLACE(@body, '', '') SET @body = REPLACE(@body, '', '')

Это создаст элементы ячейки с форматом

value

. Быстрый блок в верхней части строки, и вы будете иметь выровненные по центру значения с простой настройкой.

Другой ситуацией, которую мне нужно было решить, было включение ссылок в разметку. Пока значение в ячейке является значением, которое вам нужно в href, это довольно легко решить. Я расширю этот пример, добавив поле идентификатора, которое я хочу связать с подробным URL-адресом.

 DECLARE @body NVARCHAR(MAX) SET @body = N'' + N'' + CAST(( SELECT p.ID as tda p.ProblemType AS td, p.Onset AS td, p.DiagnosisStatus AS td FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML RAW('tr'), ELEMENTS ) AS NVARCHAR(MAX)) + N'
ProblemOnsetStatus
' SET @body = REPLACE(@body, '', 'click-me')

Этот пример не учитывает использование значения в ячейке внутри текста ссылки, но это разрешимая проблема с некоторыми работами CHARINDEX.

Моя последняя реализация этой системы заключалась в том, чтобы отправлять HTML-письма на основе SQL-запросов. У меня была повторная потребность в выравнивании ячеек и общих типах ссылок, поэтому я переместил функции замены в общую скалярную функцию в SQL, поэтому мне не пришлось иметь их во всех моих хранимых процедурах, отправляющих электронную почту.

Надеюсь, это добавит некоторую ценность.

Это общее решение с использованием FUNCTION на базе XML с использованием FLWOR

Он преобразует любой SELECT в таблицу XHTML.

Он работает (тестируется) с 2008R2 +, но я уверен, что это будет работать в 2008 году, возможно, даже в 2005 году. Если кто-то хочет проверить это, пожалуйста, оставьте комментарий. Спасибо

Следующая функция заменяет все различные функции, которые я предоставил раньше (при необходимости, см. Предыдущую версию)

 CREATE FUNCTION dbo.CreateHTMLTable ( @SelectForXmlPathRowElementsXsinil XML ,@tblClass VARCHAR(100) --NULL to omit this class ,@thClass VARCHAR(100) --same ,@tbClass VARCHAR(100) --same ) RETURNS XML AS BEGIN RETURN ( SELECT @tblClass AS [@class] ,@thClass AS [thead/@class] ,@SelectForXmlPathRowElementsXsinil.query( N'let $first:=/row[1] return  { for $th in $first/* return {if(not(empty($th/@caption))) then xs:string($th/@caption) else local-name($th)} } ') AS thead ,@tbClass AS [tbody/@class] ,@SelectForXmlPathRowElementsXsinil.query( N'for $tr in /row return {$tr/@class} { for $td in $tr/* return if(empty($td/@link)) then {$td/@class}{string($td)} else {$td/@class}{string($td)} } ') AS tbody FOR XML PATH('table'),TYPE ) END GO 

Самый простой вызов

Макет таблицы с некоторыми значениями

 DECLARE @tbl TABLE(ID INT, [Message] VARCHAR(100)); INSERT INTO @tbl VALUES (1,'Value 1') ,(2,'Value 2'); 

– Вызов должен заключить SELECT ... FOR XML в paranthesis!
–click запустить fragment, чтобы увидеть результат!

 SELECT dbo.CreateHTMLTable ( (SELECT * FROM @tbl FOR XML PATH('row'),ELEMENTS XSINIL) ,NULL,NULL,NULL ); 
  
ID Message
1 Value 1
2 Value 2

Все эти ответы работают нормально, но я столкнулся с проблемой в последнее время, когда я хотел иметь условное форматирование на html ie. Я хотел, чтобы свойство стиля td изменялось в зависимости от данных. Основной формат аналогичен добавлению установки td =:

 declare @body nvarchar(max) set @body = cast (select 'color:red' as 'td/@style', td = p.ProblemType, '', td = p.Onset, '', td = p.DiagnosisStatus, '' from tblProblemList p where p.PatientUnitNumber = @PatientUnitNumber for xml path('tr'), type) as nvarchar(max) 

Чтобы добавить условное форматирование к этому, вам просто нужно добавить оператор case:

 declare @body nvarchar(max) set @body = cast select cast (case when p.ProblemType = 1 then 'color:#ff0000;' else 'color:#000;' end as nvarchar(30)) as 'td/@style', td = p.ProblemType, '', td = p.Onset, '', td = p.DiagnosisStatus, '' from tblProblemList p where p.PatientUnitNumber = @PatientUnitNumber for xml path('tr'), type) as nvarchar(max) 

Я столкнулся с этой проблемой некоторое время назад. Вот как я решил это:

 SELECT p.ProblemType AS "td" , '' AS "text()" , p.Onset AS "td" , '' AS "text()" , p.DiagnosisStatus AS "td" FROM tblProblemList p WHERE p.PatientUnitNumber = @PatientUnitNumber FOR XML PATH('tr') 

Попробуй это:

 FOR XML raw, elements, root('tr') 

Уже есть огромные ответы. Я просто хотел добавить, что вы также можете использовать стили в своем запросе, которые могут быть хорошими с точки зрения дизайна.

 BEGIN SET NOCOUNT ON; DECLARE @htmlOpenTable VARCHAR(200) = '' DECLARE @htmlCloseTable VARCHAR(200) = '
' DECLARE @htmlTdTr VARCHAR(max) = ( SELECT 'border-top: 1px solid #2c3e50' as [td/@style], someColumn as td, '', 'border-top: 1px solid #2c3e50' as [td/@style], someColumn as td, '' FROM someTable WHERE someCondition FOR XML PATH('tr') ) SELECT @htmlOpenTable + @htmlTdTr + @htmlCloseTable END

Где someColumn – ваш атрибут из вашей таблицы

И someTable – это название вашей таблицы

И someCondition является необязательным, если вы используете WHERE claus

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

Конечно, вы можете использовать стили другими способами. На самом деле, всегда лучше использовать внешний CSS, но это хорошая практика, чтобы знать, как создавать встроенные стили, потому что они могут понадобиться им

я предпочитаю делать это:

 select convert(xml, ( select 'column1' as th, 'column2' as th for xml raw('tr'),elements )), convert(xml, ( select t1.column1 as td, t1.column2 as td from #t t1 for xml raw('tr'),elements )) for xml raw('table'),elements 
  • Как вы глобально настроили jacksonа игнорировать неизвестные свойства в течение весны?
  • NSXMLParser на iPhone, как я его использую, учитывая xml-файл (newb здесь: \)
  • Как создать схему XSD из classа?
  • Как загрузить org.w3c.dom.Document из XML в строку?
  • Android - Изменить тему приложения onClick
  • Передача параметров в таблицу стилей XSLT через .NET
  • XSD - как разрешить элементы в любом порядке сколько угодно раз?
  • Можно ли использовать динамическое выражение xPath в таблице стилей xslt?
  • Преобразование XDocument в XmlDocument и наоборот
  • Ошибка: соответствие целевой команды обработки « » не допускается
  • Настройте точку вместо запятой в числовых значениях
  • Interesting Posts

    Почему при использовании этой составной формы происходит замена значений с помощью XOR?

    Java: Получить месяц Целое число с даты

    Диспетчер задач показывает 100% загрузку процессора, но ничего в списке процессов не делает

    Отключить сочетание клавиш Alt + Arrow

    Модульное тестирование XCode 5: запускает мое приложение

    Как я могу вручную загрузить / выгрузить драйвер в Windows Vista?

    Пример демонстрации на основе classа Django

    Применить форматирование валюты к UITextField в событии изменения

    Получение эскиза видеоролика или данных в iPhone SDK

    Использовать зарезервированное ключевое слово enum case

    Ошибка Android в Eclipse: «Невозможно выполнить dex: невозможно слить новый индекс 65799 в инструкцию без jumbo!»

    Как номера версий .NET Framework, CLR и Visual Studio связаны друг с другом?

    Как обрабатывать бесконечный цикл, вызванный недопустимым вводом (InputMismatchException) с помощью Scanner

    Передача метаданных Songbird на новый компьютер

    Как очистить предыдущие ожидания от объекта?

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