2008-11-07 8 views
0

j'ai obtenu une structure de ligne ressemble ID bigint, ScanRept XMLSQL Server 2005 - récupère un champ XML dans un fichier; certains champs XML dans leurs propres fichiers

Je veux retrouver avec un fichier nommé 4.xml contenant juste le xml de la colonne de ScanRept où le numéro d'identification est 4.

Je ne veux pas le faire de manière interactive (en allant dans Manager Studio, en trouvant la ligne, en cliquant avec le bouton droit sur le champ et en faisant Save AS) - c'est ce que je ferai si je ne peux pas comprendre une meilleure façon.

J'ai du C# disponible; Si c'est faisable avec sqlcmd, c'est ma préférence (car il y aura probablement beaucoup de variations que je ne peux pas anticiper en ce moment).

Répondre

0

Il y a probablement une meilleure façon de le faire ... mais sans tester quelque chose comme ça pourrait work.C#

SqlDataAdapter adapter = new SqlDataAdapter("SELECT ID, ScanRept FROM TableName", "connString"); 
DataTable dt = new DataTable(); 
adapter.Fill(dt); 

foreach (DataRow row in dt.Rows) 
{ 
    string type = row["ID"].ToString(); 
    string location = "C\\" + type + ".xml"; 
    string xml = row["ScanRept"].ToString(); 
    XmlTextWriter writer = new XmlTextWriter(location, null); 
    writer.WriteString(xml); 
    writer.Flush(); 
    writer.Close(); 
} 
0

approche de la ligne de commande avec bcp:

bcp "SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4" queryout 4.xml -c -S<ServerName> -U<UserName> -P<Password> 

ou pour les connexions sécurisées

bcp "SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4" queryout 4.xml -c -S<ServerName> -T 

Ligne de commande avec sqlcmd:

sqlcmd -U<Username> -P<Password> -S<ServerName> -h -1 -Q "SET NOCOUNT ON SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4;" -o 4.xml 

ou pour les connexions sécurisées

sqlcmd -E -S<ServerName> -h -1 -Q "SET NOCOUNT ON SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4;" -o 4.xml 
0

Merci à la fois de vous - bons conseils

Panos, il tronque après une certaine longueur - qui est de 258 caractères?

Toytown, qui fonctionne à l'exception writer.WriteRaw() est ce que je dois, ou bien il encode le balisage XML pour ce faire des données valides, par exemple, < se voit transformée en virgule esperluette lt

Jusqu'à présent, je ne peux t obtenir n'importe quoi, mais un long flux de xml (pas d'indentation, pas de sauts de ligne). Je ne suis pas sûr qu'il y ait des espaces de formatage dans mes données, mais je sais que lorsque je clique avec le bouton droit sur le champ dans SSMS, MS XML Editor affiche le tout formaté joli.

Eh bien, comme le disent les Français, «Ce fichu XML est une douleur dans ma French Too-SHEE». Vos deux commentaires aident et je voterai pour vos réponses une fois que je m'inscrirai sur ce truc d'id ouvert.

0

Voici une autre approche qui lui permettent l'écrire assez, la girlz façon franch chaud comme:

 string IRIXno = args[0] ; 

     string connectionString ; 

     string query = "Select ID, Report FROM Reports WHERE id =" + IRIXno; 

     try 

     { 

      connectionString = ConfigurationSettings.AppSettings["ConnectionString"]; 

     } 

     catch 

     { 

      Console.WriteLine("YOur connection string isn't set or something."); 

      return; 

     } 

     SqlConnection conn = new SqlConnection(connectionString); 

     conn.Open(); 

     SqlCommand sqlComm = new SqlCommand(query, conn); 

     sqlComm.CommandType = CommandType.Text; 

     SqlDataReader reader = sqlComm.ExecuteReader(); 

     reader.Read(); // one and only row 

     XmlDocument doc = new XmlDocument(); 

     XmlReader xmlReader = reader.GetSqlXml(1).CreateReader() ;//second column is our guy 

     doc.Load(xmlReader); 


     string outfile = "H:\\" + IRIXno + ".xml"; 

     doc.Save(outfile) ; 
Questions connexes