2016-12-21 25 views
0

您好我是相当新的转换T-SQL查询到XML。我编写了下面的示例查询来获取XML输出,但是我的需求需要在Message Root之后的第二行上有文本调用“Header /”。我的问题是“标题”和“/”之间的空格。添加文字后,我的XML根从TSQL到XML

DECLARE @xmlCar xml; 
DECLARE @strCar varchar(max); 
DECLARE @sxml xml; 
SET @xmlCar = (
SELECT 1 AS [@ID] 
    ,(SELECT 123 AS [AddressID] 
    ,555 AS [AddressNumber] 
    ,'Somewhere Street' AS [AddressStreet] 
    ,'Nashville' AS [AddressCity] 
    ,'TN' AS [AddressState] 
    ,37115 AS [AddressZip] 
    ,'D2QZ0OLXKG' AS [status_rtk/@ID] 
    ,'Institution Tax Status rtk1' AS [status_rtk] 
    ,'D2QZ0OO0BF' AS [category_rtk/@ID] 
    ,'Inst Facility type rtk1' AS [category_rtk] 

FOR XML PATH('AddressDemographic'),ROOT('AddressDemographics'),TYPE) 
FOR XML PATH('USER'), ROOT('Message'), TYPE) 

SET @sxml = REPLACE(CAST(@xmlCar AS VARCHAR(MAX)),'<Message>','<Message><Header/>') 

SELECT @sxml 


<Message> 
    <Header /> 
    <USER ID="1"> 
    <AddressDemographics> 
     <AddressDemographic> 
     <AddressID>123</AddressID> 
     <AddressNumber>555</AddressNumber> 
     <AddressStreet>Somewhere Street</AddressStreet> 
     <AddressCity>Nashville</AddressCity> 
     <AddressState>TN</AddressState> 
     <AddressZip>37115</AddressZip> 
     <status_rtk ID="D2QZ0OLXKG">Institution Tax Status rtk1</status_rtk> 
     <category_rtk ID="D2QZ0OO0BF">Inst Facility type rtk1</category_rtk> 
     </AddressDemographic> 
    </AddressDemographics> 
    </USER> 
</Message> 
+0

请编辑您的问题,并将**期望的输出**添加到它。 –

回答

0

您的查询可能与此略有改善,但是这不是回答你的问题:

DECLARE @xmlCar xml= 
(
SELECT 
    '' AS [Header] 
    ,(
     SELECT 1 AS [@ID] 
      ,123 AS [AddressDemographic/AddressDemographics/AddressID] 
      ,555 AS [AddressDemographic/AddressDemographics/AddressNumber] 
      ,'Somewhere Street' AS [AddressDemographic/AddressDemographics/AddressStreet] 
      ,'Nashville' AS [AddressDemographic/AddressDemographics/AddressCity] 
      ,'TN' AS [AddressDemographic/AddressDemographics/AddressState] 
      ,37115 AS [AddressDemographic/AddressDemographics/AddressZip] 
      ,'D2QZ0OLXKG' AS [AddressDemographic/AddressDemographics/status_rtk/@ID] 
      ,'Institution Tax Status rtk1' AS [AddressDemographic/AddressDemographics/status_rtk] 
      ,'D2QZ0OO0BF' AS [AddressDemographic/AddressDemographics/category_rtk/@ID] 
      ,'Inst Facility type rtk1' AS [AddressDemographic/AddressDemographics/category_rtk] 
     FOR XML PATH('USER'), TYPE 
    ) 
FOR XML PATH('Message') 
); 

SELECT @xmlCar 

你真正问的是这个

我的问题是一个空白“Header”和“/”之间的空格

在您自己的尝试中,您使用字符串方法将<Header/>引入到XML中。当你看着它,有一个空白不知从哪儿来了,那是打扰你......

答案是:这是毫无意义的

我不知道,为什么这个空白的事情在你的情况下,但它不应该...

XML不作为文本内部存储,而是作为一种树。你看到的只是这个的转录,为了让它可读。

看看下面这个例子

SELECT CAST('<root><test><![CDATA[Content with forbidden characters <<>> &]]></test></root>' AS XML) 

这是隐式转换为

<root> 
    <test>Some Content with forbidden characters &lt;&lt;&gt;&gt; &amp;</test> 
</root> 

你明白我的意思吗? XML不只是有额外字符的文本...

所以答案是:

<Header />元素是<Header/>语义相同。如何将显示给用户不是您的愿望。

执行这个的唯一方法是在字符串级别,但我不会建议这个。在这种情况下,只需使用我的查询并添加

SELECT REPLACE(CAST(@xmlCar AS nvarchar(MAX)),'<Header />','<Header/>') 
+0

感谢Shnugo的详细解释。 –