2010-07-20 2 views
1

У меня есть онлайн-форма, в которой каждая запись добавляет данные в xml в столбец xml в SQL.Конкатенация нескольких строк столбца XML в SQL

ApplicationID(uniqueidentifier) | DateModified | ApplicationForm(XML) 

Что мне нужно сделать, это выполнить запрос на выборку, которая будет захватывать все значения ApplicationForm XML, и объединить их вместе, чтобы сформировать один результат, например,

Row1: <ApplicationForm type=""></ApplicationForm> 
Row2: <ApplicationForm type=""></ApplicationForm> 

Выберите результат:

<Applications> 
    <ApplicationForm type=""></ApplicationForm> 
    <ApplicationForm type=""></ApplicationForm> 
</Applications> 

ответ

0

Посмотрите на this page, в котором перечислены целый ряд способов для конкатенации строк данных.

+0

Возможно, существует более аккуратный способ, чем стринги g concatenation, хотя видя, что входные строки и желаемый результат являются XML. –

+0

Посмотрели на XML AUTO и т. Д., Но лучшее, что я могу получить, это . У xml-данных уже есть «корневой» узел, который также добавляется в столбец. – mickyjtwin

+0

@mickyjtwin: В вашей 'FOR XML AUTO' вы, вероятно, могли бы добавить', ROOT ('Applications') 'и таким образом определить, что корневой узел следует называть –

0

Возможно, это лучший способ сделать это, но я указал тег ApplicationForm как тег, который нужно удалить, а затем удалил его.

DECLARE @a TABLE (ID UNIQUEIDENTIFIER, 
        DateModified DATETIME, 
        ApplicationForm XML) 

INSERT INTO @a 
     (ID, DateModified, ApplicationForm) 
VALUES (NEWID(), -- ID - uniqueidentifier 
      '2010-12-07 18:47:36', -- DateModified - datetime 
      '<Application><Form>123</Form></Application>' 
     ) , 
     (NEWID(), -- ID - uniqueidentifier 
      '2010-12-07 18:47:36', -- DateModified - datetime 
      '<Application><Form>456</Form></Application>' 
     )    

DECLARE @Result VARCHAR(MAX) 
SET @Result = CONVERT(VARCHAR(MAX), (SELECT ApplicationForm AS "StripTagOut" 
FROM @a 
FOR XML PATH(''), ROOT('Applications'), TYPE )) 

SELECT CONVERT(xml, REPLACE(REPLACE(@Result, '</StripTagOut>', ''), '<StripTagOut>', '')) 
0

Это был эксперимент с использованием XML EXPLICIT который я считаю работы:

SELECT 1 AS Tag, 
     NULL AS Parent, 
     NULL [Applications!1], 
     NULL [ApplicationForm!2!!XMLTEXT] 
UNION ALL 
SELECT 2 AS Tag, 
     1 AS Parent, 
     NULL [Applications!1], 
     ApplicationForm [ApplicationForm!2!!XMLTEXT]  
FROM YourTable 
FOR XML EXPLICIT 

Для собственного удовольствия, вот пример сценария я использовал

CREATE TABLE XmlTest 
(
    ApplicationForm xml 
) 

INSERT INTO XmlTest VALUES ('<ApplicationForm type="a"><SomeTag>SomeContent</SomeTag></ApplicationForm>') 
INSERT INTO XmlTest VALUES ('<ApplicationForm type="b"><SomeTag>SomeOtherContent</SomeTag></ApplicationForm>') 

SELECT 1 AS Tag, 
     NULL AS Parent, 
     NULL [Applications!1], 
     NULL [ApplicationForm!2!!XMLTEXT] 
UNION ALL 
SELECT 2 AS Tag, 
     1 AS Parent, 
     NULL [Applications!1], 
     ApplicationForm [ApplicationForm!2!!XMLTEXT]  
FROM XmlTest  
FOR XML EXPLICIT 

Какой выход

<Applications> 
    <ApplicationForm type="a"> 
    <SomeTag>SomeContent</SomeTag> 
    </ApplicationForm> 
    <ApplicationForm type="b"> 
    <SomeTag>SomeOtherContent</SomeTag> 
    </ApplicationForm> 
</Applications> 
Смежные вопросы