Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
Как объединить открывающий и закрывающий xml-тэги в одном контейнере?
Нужно получить результат <TEXT />, используется FOR XML PATH.
3 янв 12, 14:58    [11855679]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
tempdb-112
Guest
select
null
for xml path('TEXT')

(уточните вопрос)
3 янв 12, 17:48    [11856081]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
tempdb-112,
спасибо, но все сложнее, нужно получить
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Description>
    <CurrentDate value="1310399153" />
    <MessageType value="201" />
    <Recovery />
    <Plant code="5" />
    <XSDVersion value="1" />
    <SenderCode value="SXBDConsoleApplication" />
    <CurrentLanguage value="US" />
  </Description>
  <SampleAnalysisList>
    <SampleAnalysis code="SPL_HM_111222">
      <CurrentDate />
      <Activate />
      <Label />
      <Command value="1" />
      <AbstractionDescription plant="5" heat="111222" vessel="HMLadle1" />
      <OccurrenceNumber value="1" />
      <MaterialCode value="HotMetal" />
      <MeasureDate />
      <ObtainingDate />
      <SampleSource value="2" />
      <SampleClass value="6" />
      <Analysis>
        <Compound code="2" measure="0.0444558" />
        <Compound code="6" measure="0.0084" />
        <Compound code="3" measure="0.006" />
        <Compound code="5" measure="0.00034" />
        <Compound code="4" measure="0.00078" />
        
      </Analysis>
    </SampleAnalysis>
  </SampleAnalysisList>
</Root>


Пишу:
WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' AS xsd, 'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT  Currentdate AS [Description/CurrentDate/@value]
		,MessageType AS [Description/MessageType/@value]
		,Plant AS [Description/Plant/@code]
		,XSDVersion AS [Description/XSDVersion/@value]
		,'SXBDConsoleApplication' AS [Description/SenderCode/@value]
		,'US' AS [Description/CurrentLanguage/@value]
		,SampleAnalysis AS [SampleAnalysisList/SampleAnalysis/@code]
		,'1' AS [SampleAnalysisList/SampleAnalysis/Command/@value]
		,'5' AS [SampleAnalysisList/SampleAnalysis/AbstractionDescription/@plant]
		,AbstractionDescription_heat AS [SampleAnalysisList/SampleAnalysis/AbstractionDescription/@heat]
		,AbstractionDescription_vessel AS [SampleAnalysisList/SampleAnalysis/AbstractionDescription/@vessel]
		,OccurrenceNumber AS [SampleAnalysisList/SampleAnalysis/OccurrenceNumber/@value]
		,MaterialCode AS [SampleAnalysisList/SampleAnalysis/MaterialCode/@value]
		,SampleSource AS [SampleAnalysisList/SampleAnalysis/SampleSource/@value]
		,SampleClass AS [SampleAnalysisList/SampleAnalysis/SampleClass/@value]
		,Compound_code AS [SampleAnalysisList/SampleAnalysis/Analysis/Compound/@code]
		,Compound_measure AS [SampleAnalysisList/SampleAnalysis/Analysis/Compound/@measure]
  FROM AUTO_GSM.dbo.Label_Value
FOR XML PATH ('Root')


Не знаю как добавить пустые элементы.
3 янв 12, 18:30    [11856246]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
mike909
Member

Откуда:
Сообщений: 662
vtornick,
select
   1 as [@a]
  ,2 as [@b]
  ,'' as [TEXT]
for xml path('root')
?
3 янв 12, 23:42    [11856996]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
tempdb-112
Guest
select
   1 as [@a]
  ,2 as [@b]
  ,(select null for xml path('TEXT'), type)
for xml path('root')
4 янв 12, 05:33    [11857251]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
mike909,

получается два контейнера с пустотой внутри, вместо <... />
<root a="1" b="2">
  <TEXT></TEXT>
</root>
4 янв 12, 10:40    [11857347]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
спасибо tempdb-112,
вроде то что надо, но в мое случае вылазят следующие моменты:
1) из-за строчки
WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema' AS xsd, 'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
весь этот текст влазит в наш пустой элемент -
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Description>
    <CurrentDate value="AAAAAAAAD78=" />
    <MessageType value="201" />
    <Plant code="5" />
  </Description>
  <TEXT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

2) этот тег не вписывается в нужную иерархию и вместо:
Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Description>
    <CurrentDate value="1310399153" />
    <MessageType value="201" />
    <Recovery />
    <Plant code="5" />
    <XSDVersion value="1" />
    <SenderCode value="SXBDConsoleApplication" />
    <CurrentLanguage value="US" />
  </Description>


получаю:
<Root>
  <Description>
    <CurrentDate value="AAAAAAAAD78=" />
    <MessageType value="201" />
    <Plant code="5" />
  </Description>
  <TEXT />
  <Description>
    <XSDVersion value="1" />
    <SenderCode value="SXBDConsoleApplication" />
    <CurrentLanguage value="US" />
  </Description>
4 янв 12, 10:52    [11857356]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
tempdb-112
Guest
vtornick, см. https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=656169&msg=7067683

select (
	select
	   1 as [@a]
	  ,2 as [@b]
	  ,(select null for xml path('TEXT'), type)
	for xml path('root'), type
).query('<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">{(/root/@*), (/root/*)}</root>')
4 янв 12, 14:47    [11857927]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
vtornick,
DECLARE @rcvr NCHAR(1) = NULL;
--SET @rcvr = N'A';
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS xsd, 'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT CURRENT_TIMESTAMP AS [Description/CurrentDate/@value]
     , 201 AS [Description/MessageType/@value]
     , CAST(N'<Recovery' + COALESCE(N' value="' + CAST(@rcvr AS NVARCHAR(MAX)) + N'"', N'') + N' />' AS XML) AS "Description"
--     , (SELECT @rec AS "@value" FOR XML PATH('Recovery'), TYPE) AS "Description"
--     , @rec AS [Description/Recovery/@value]
     , 5 AS [Description/Pland/@code]
     , 1 AS [Description/XSDVersion/@value]
     , 'SXBDConsoleApplication' AS [Description/SenderCode/@value]
     , 'US' AS [Description/CurrentLanguage/@value]
FOR XML PATH ('Root')
--      , ELEMENTS XSINIL
;
4 янв 12, 14:49    [11857933]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
andrey odegov,
не работает:
Msg 139, Level 15, State 1, Line 0
Невозможно присвоить значение по умолчанию локальной переменной.
Msg 137, Level 15, State 2, Line 6
Необходимо объявить скалярную переменную "@rcvr".
4 янв 12, 15:28    [11858024]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
озвучьте версию sql server
4 янв 12, 15:36    [11858043]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
На данный момент 2 вышеперечисленные проблемы решили так:
DECLARE @text AS NVARCHAR(MAX)

SET @text=(
SELECT       CurrentDate AS [Description/CurrentDate/@value]
            ,MessageType AS [Description/MessageType/@value]
            ,NULL AS [Description/Recovery]
            ,5 AS [Description/Plant/@code]
            ,XSDVersion AS [Description/XSDVersion/@value]
            ,'SXBDConsoleApplication' AS [Description/SenderCode/@value]
            ,'US' AS [Description/CurrentLanguage/@value]
FROM AUTO_GSM.dbo.Label_Value
FOR XML PATH ('Root'), ELEMENTS XSINIL
)

SET @text = REPLACE(@text,'<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">',
'<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">')

SET @text = REPLACE(@text,'xsi:nil="true"','')

DECLARE @xml XML
SET @xml = (SELECT @text)


Результат:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Description>
    <CurrentDate value="AAAAAAAAD78=" />
    <MessageType value="201" />
    <Recovery />
    <Plant code="5" />
    <XSDVersion value="1" />
    <SenderCode value="SXBDConsoleApplication" />
    <CurrentLanguage value="US" />
  </Description>
</Root>
4 янв 12, 15:41    [11858054]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
vtornick
Member

Откуда:
Сообщений: 7
andrey odegov,

скорее всего из-за версии.

2005 sp2
4 янв 12, 15:42    [11858058]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
DECLARE @rcvr NCHAR(1);
SET @rcvr = NULL;
--SET @rcvr = N'A';
WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema' AS xsd, 'http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT CURRENT_TIMESTAMP AS "Description/CurrentDate/@value"
     , 201 AS "Description/MessageType/@value"
     , CAST(N'<Recovery' + COALESCE(N' value="' + CAST(@rcvr AS NVARCHAR(MAX)) + N'"', N'') + N' />' AS XML) AS "Description"
--     , (SELECT @rec AS "@value" FOR XML PATH('Recovery'), TYPE) AS "Description"
--     , @rec AS "Description/Recovery/@value"
     , 5 AS "Description/Pland/@code"
     , 1 AS "Description/XSDVersion/@value"
     , 'SXBDConsoleApplication' AS "Description/SenderCode/@value"
     , 'US' AS "Description/CurrentLanguage/@value"
FOR XML PATH ('Root')
--      , ELEMENTS XSINIL
;
4 янв 12, 16:48    [11858222]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
а так?
with xmlnamespaces('ns' as ns)
select 1 as "w/a/@v"
	 , 2 as "w/b/@v"
	 , case
	   when v is null then cast(N'<x />' as xml)
	   else cast(cast(v as nvarchar(max)) as xml).query('<x v="{.}" />')
	   end as "w"
  from (select newid() as v union all select null) as t
for xml path('root')
;
4 янв 12, 18:44    [11858698]     Ответить | Цитировать Сообщить модератору
 Re: как объединить открывающий и закрывающий xml-тэги  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Подключайтесь: suppress namespace attributes in nested SELECT FOR XML statements
4 янв 12, 19:27    [11858877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить