sql >> Databasteknik >  >> RDS >> Sqlserver

Hur exporterar man XML med en SQL Server-fråga?

Om du bara behöver lagra XML och inte göra något annat åt den, är detta förmodligen det enklaste sättet att åstadkomma detta - med rakt enkelt 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);
}

Detta skapar en fil D:\test.xml (eller ändra det för att matcha ditt system) och kommer att lägga in dessa XML-taggar i den filen.

SqlCommand objektet har också en .ExecuteXmlReader() metod som skulle returnera en XmlReader objekt för att skanna och manipulera XML - inte bara returnera en sträng. Använd det som är mest meningsfullt för dig!

PS:även utdata från FOR XML AUTO är lite .... låt oss säga ... suboptimal. Den använder dbo.Employee eftersom det är den huvudsakliga XML-taggen och så vidare... med SQL Server 2008 rekommenderar jag starkt att du tittar på att använda FOR XML PATH istället - det låter dig justera och anpassa layouten för XML-utdata.

Jämför din ursprungliga XML-utdata med 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" />

mot den här frågan - bara för att se skillnaden:

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

Utdata är:

<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>


  1. Hittar inte Oracle Connection när en PostGIS-anslutning är definierad

  2. mysql:hänvisar till kolumner efter siffror

  3. ORA-04021:timeout inträffade i väntan på att låsa objekt

  4. Gruppera efter sql-fråga på kommakopplad kolumn