0

我有一个表,其中包含要导出到 xml 文件的内容(如博客文章,相当长的文本)。

所以我想要它:

<table>
  <column1>1231</column1>
  <column2>January 1, 2001</column2>
  <column3>some very long text will all types of characters in it</column3>
</table>

有没有内置的方法来做到这一点?

基本上每一列都有自己的元素。

理想情况下,内容应该是 CDATA,因为内容可能包含任何类型的字符。

我有 sql server 2008 express。

4

2 回答 2

1

您可以使用FOR XMLSQL 构造来执行此操作。请阅读这里

于 2012-10-03T02:30:01.343 回答
1

从 SQL Server 2005 开始,FOR XML子句提供了一种将 SQL 查询结果转换为 XML 的方法。

例如,考虑一个包含 Blgd、Suit、SQFT、PDate 列的表格。

SELECT * FROM building FOR XML AUTO

会将表的内容转换为以下 XML:

<building Bldg="1" SUit="1" SQFT="1000" PDate="2012-09-24T00:00:00" />
<building Bldg="1" SUit="1" SQFT="1500" PDate="2011-12-31T00:00:00" />

如果您希望列成为元素,那么

SELECT * FROM building FOR XML AUTO, ELEMENTS

会将内容转换为以下 XML:

<building>
  <Bldg>1</Bldg>
  <SUit>1</SUit>
  <SQFT>1000</SQFT>
  <PDate>2012-09-24T00:00:00</PDate>
</building>
<building>
  <Bldg>1</Bldg>
  <SUit>1</SUit>
  <SQFT>1500</SQFT>
  <PDate>2011-12-31T00:00:00</PDate>
</building>

如果要将文本字段建模为CDATA部分,则应使用该FOR XML EXPLICIT子句并按照此处的指南定义 XML 模式。

如果上面的 Building 表有一个 text_col 类型的列TEXT,应该在生成的 XML 中建模为 CDATA 部分,那么SELECT查询将如下所示:

SELECT 
    1 as Tag,
    NULL as Parent,
    Bldg AS [Building!1!Bldg!ELEMENT],
    text_col AS [Building!1!!CDATA]
FROM Building 
WHERE text_col IS NOT NULL
FOR XML EXPLICIT

结果如下:

<Building><Bldg>1</Bldg><![CDATA[From SQL Server 2005, the FOR XML clause provides a way to convert the results of an SQL query to XML.

E.g. Consider a table building with Blgd, Suit, SQFT, PDate columns.

SELECT * FROM building FOR XML AUTO

will convert the contents of table to the following XML:

<building Bldg="1" SUit="1" SQFT="1000" PDate="2012-09-24T00:00:00" />
<building Bldg="1" SUit="1" SQFT="1500" PDate="2011-12-31T00:00:00" />
If you want the columns to be elements, then

SELECT * FROM building FOR XML AUTO, ELEMENTS
would convert the contents to following XML:

<building>
  <Bldg>1</Bldg>
  <SUit>1</SUit>
  <SQFT>1000</SQFT>
  <PDate>2012-09-24T00:00:00</PDate>
</building>
<building>
  <Bldg>1</Bldg>
  <SUit>1</SUit>
  <SQFT>1500</SQFT>
  <PDate>2011-12-31T00:00:00</PDate>
</building>]]></Building>
于 2012-10-03T02:36:43.443 回答