如何使用SQL Server查询导出XML?

hat*_*tem 7 sql-server-2008

假设我有一张Employee这样的桌子

EmpID, EmpName

1    , hatem
Run Code Online (Sandbox Code Playgroud)

我写了一个查询: select * from Employee for xml auto

所以输出将是XML格式.

我想知道如何将结果导出到XML文件以保存在我的计算机驱动器上,因为我需要从此文件夹中读取XML文件并在我的.net应用程序中反序列化它们.

mar*_*c_s 15

如果您只需要存储XML而不需要执行任何其他操作,这可能是实现此目的的最简单方法 - 使用简单的ADO.NET:

string query = "SELECT EmployeeID, LastName, FirstName, Title, BirthDate, HireDate FROM dbo.Employees FOR XML AUTO";

using(SqlConnection _con = new SqlConnection("server=(local);database=Northwind;integrated security=SSPI;"))
using (SqlCommand _cmd = new SqlCommand(query, _con))
{
    _con.Open();
    string result = _cmd.ExecuteScalar().ToString();
    _con.Close();

    File.WriteAllText(@"D:\test.xml", result);
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个文件D:\test.xml(或更改以匹配您的系统),并将这些XML标记放入该文件中.

SqlCommand对象还有一个.ExecuteXmlReader()方法可以返回一个XmlReader对象来扫描和操作XML - 而不仅仅是返回一个字符串.使用对你最有意义的东西!

PS:同样,输出FOR XML AUTO有点......让我们说......不是最理想的.它使用了dbo.Employee它的主要XML标签等等...对于SQL Server 2008,我强烈建议您考虑使用FOR XML PATH- 它允许您调整和自定义XML输出的布局.

比较原始XML输出 FOR XML AUTO

<dbo.Employees _x0040_ID="1" LastName="Davolio" FirstName="Nancy" Title="Sales Representative" BirthDate="1948-12-08T00:00:00" HireDate="1992-05-01T00:00:00" />
<dbo.Employees _x0040_ID="2" LastName="Fuller" FirstName="Andrew" Title="Vice President, Sales" BirthDate="1952-02-19T00:00:00" HireDate="1992-08-14T00:00:00" />
Run Code Online (Sandbox Code Playgroud)

针对此查询 - 只是为了看到差异:

SELECT 
    [EmployeeID] AS '@ID',
    [LastName], [FirstName],
    [Title],
    [BirthDate], [HireDate]
FROM 
    [dbo].[Employees]
FOR XML PATH('Employee'), ROOT('Employees')
Run Code Online (Sandbox Code Playgroud)

输出是:

<Employees>
  <Employee ID="1">
    <LastName>Davolio</LastName>
    <FirstName>Nancy</FirstName>
    <Title>Sales Representative</Title>
    <BirthDate>1948-12-08T00:00:00</BirthDate>
    <HireDate>1992-05-01T00:00:00</HireDate>
  </Employee>
  <Employee ID="2">
    <LastName>Fuller</LastName>
    <FirstName>Andrew</FirstName>
    <Title>Vice President, Sales</Title>
    <BirthDate>1952-02-19T00:00:00</BirthDate>
    <HireDate>1992-08-14T00:00:00</HireDate>
  </Employee>
Run Code Online (Sandbox Code Playgroud)