SQL Server 2005 - obtenir un champ XML dans un fichier; des champs XML dans leurs propres fichiers

StackOverflow https://stackoverflow.com/questions/271957

  •  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).

Était-ce utile?

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) ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top