SQL Server 2005 - obtenir un champ XML dans un fichier; des champs XML dans leurs propres fichiers
-
07-07-2019 - |
Question
J'ai une structure de lignes qui ressemble à ID bigint, ScanRept XML
Je souhaite terminer avec un fichier nommé 4.xml contenant uniquement le code XML de la colonne ScanRept dont le numéro d'identification est 4.
Je ne veux pas le faire de manière interactive (en accédant à Manager Studio, en recherchant la rangée, en cliquant avec le bouton droit de la souris sur le champ et en enregistrant l'option Enregistrer sous), c'est ce que je ferai si je ne peux pas trouver un meilleur moyen. .
J'ai le C # disponible; si cela est faisable avec sqlcmd, c'est ma préférence (car il y aura probablement beaucoup de variations que je ne peux pas anticiper pour le moment).
La solution
Il existe probablement un meilleur moyen de le faire ... mais sans tester quelque chose comme cela pourrait fonctionner.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();
}
Autres conseils
Approche en 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 de confiance
bcp "SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4" queryout 4.xml -c -S<ServerName> -T
Approche en 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 de confiance
sqlcmd -E -S<ServerName> -h -1 -Q "SET NOCOUNT ON SELECT ScanRept FROM <DBName>.dbo.<TableName> WHERE ID = 4;" -o 4.xml
Merci à vous deux - de bons conseils
Panos, il est tronqué après une certaine longueur, soit 258 caractères?
Toytown, cela fonctionne sauf writer.WriteRaw () est ce dont j'ai besoin, sinon il code le balisage XML pour en faire des données valides, par exemple, < se transforme en esperluette lt point-virgule
Jusqu'à présent, je ne peux obtenir qu'un seul long flux xml (pas d'indentation, pas de sauts de ligne). Je ne suis pas sûr qu'il y ait des blancs de formatage dans mes données, mais je sais que lorsque je clique avec le bouton droit de la souris sur le champ dans SSMS, cela fait apparaître MS XML Editor qui montre tout le contenu en format.
Eh bien, comme le disent les Français, & "Ce foutu XML est un problème en français, Too-SHEE &"; Vos commentaires sont utiles et je voterai pour vos réponses une fois que je me serai inscrit à ce forum ouvert.
Voici une autre approche qui permet de l'écrire en beauté, comme les filles françaises en vogue aiment:
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) ;