2012-03-13 1 views
0

peut l'un de ces outils de ligne de commande export .csv comme:BCP/sqlcmd/osql avec champs de texte encapsulés?

"int_field", "varchar_field", "another_int_field" 
10, "some text", 10 
5, "more text", 1 

etc?

je ne veux pas utiliser une vue ou une procédure stockée pour pirater les guillemets doubles dans :)

+0

Voulez-vous "" autour de certains champs int aussi? Ou est "int_field" juste un texte que vous voulez entre guillemets? – Jaques

+0

désolé - n'a pas obtenu le bon formatage. la première rangée est censée être les en-têtes de colonne (que j'imagine tout serait cité car ils sont tous les chaînes) –

+0

Pouvez-vous écrire du code en C# ou quelque chose. Il n'y a pas d'outils de ligne de commande standard pour autant que je sache, mais il sera assez facile d'en écrire un. – Jaques

Répondre

0

On dirait que cela confirme mes soupçons que la réponse est:

No.

Merci pour les suggestions alternatives.

1

Somthing que je l'ai rapidement fait. Si vous connaissez C#, vous pouvez y ajouter, sinon cela sera probablement inutile. Pas mon meilleur code, mais ça fait l'affaire. Tous les types de champs ne sont pas ajoutés ici, donc cela doit être fait.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.SqlClient; 
using System.IO; 

namespace SQLCSVExport 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool trustedConn = false; 
      string Servername = ""; 
      string Username = ""; 
      string Password = ""; 
      bool quotestring = false; 
      string fieldterminater = ","; 
      string tablename = ""; 
      string operation = ""; 
      string datafile = ""; 
      bool includeheadings = false; 

      if (args.Length < 3) 
      { 
       ShowOptions(); 
       return; 
      } 
      else 
      { 
       tablename = args[0]; 
       operation = args[1]; 
       datafile = args[2]; 
       for (int i = 3; i < args.Length; i++) 
       { 
        switch (args[i].Substring(0, 2)) 
        { 
         case "-Q": 
          quotestring = true; 
          break; 
         case "-T": 
          trustedConn = true; 
          break; 
         case "-S": 
          Servername = args[i].Substring(2); 
          break; 
         case "-U": 
          Username = args[i].Substring(2); 
          break; 
         case "-P": 
          Password = args[i].Substring(2); 
          break; 
         case "-t": 
          fieldterminater = args[i].Substring(2); 
          break; 
         case "-H": 
          includeheadings = true; 
          break; 
        } 
       } 
      } 
      SqlConnection conn; 

      if(File.Exists(datafile)) 
      { 
       try 
       { 
        File.Delete(datafile); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
        ShowOptions(); 
        return; 
       } 
      } 
      if (trustedConn) 
       conn = new SqlConnection("Integrated Security=True;Initial Catalog=master;Data Source=" + Servername); 
      else 
       conn = new SqlConnection("Password=" + Password + ";Persist Security Info=True;User ID=" + Username + ";Initial Catalog=master;Data Source=" + Servername); 
      try 
      { 
       conn.Open(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       ShowOptions(); 
       return; 
      } 
      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader read = null; 
      cmd.Connection = conn; 
      if (operation == "out") 
       cmd.CommandText = "Select * from " + tablename; 
      else 
       cmd.CommandText = tablename; 
      try 
      { 
       read = cmd.ExecuteReader(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       ShowOptions(); 
       return; 
      } 
      string Dummy = ""; 
      if (read.HasRows) 
      { 
       if(includeheadings) 
       { 
        for (int i = 0; i < read.FieldCount; i++) 
        { 
         if (quotestring) 
          Dummy += "\"" + read.GetName(i) + "\"" + fieldterminater; 
         else 
          Dummy += read.GetName(i) + fieldterminater; 
        } 
        WriteStrToFile(datafile, Dummy, fieldterminater); 
       } 
       while (read.Read()) 
       { 
        Dummy = ""; 
        for (int i = 0; i < read.FieldCount; i++) 
        { 
         switch (read[i].GetType().ToString()) 
         { 
          case "System.Int32": 
           Dummy += read[i].ToString() + fieldterminater; 
           break; 
          case "System.String": 
           if (quotestring) 
            Dummy += "\"" + read[i].ToString() + "\"" + fieldterminater; 
           else 
            Dummy += read[i].ToString() + fieldterminater; 
           break; 
          case "System.DBNull": 
           Dummy += fieldterminater; 
           break; 
          default: 
           break; 
         } 
        } 
        WriteStrToFile(datafile, Dummy, fieldterminater); 
       } 
      } 
     } 

     static void WriteStrToFile(string datafile, string dummy, string fieldterminator) 
     { 
      FileStream fs = new FileStream(datafile, FileMode.Append, FileAccess.Write); 
      StreamWriter sr = new StreamWriter(fs); 
      if (dummy.Trim().Substring(dummy.Trim().Length - 1) == fieldterminator) 
       dummy = dummy.Substring(0, dummy.Trim().Length - 1); 
      sr.WriteLine(dummy); 
      sr.Close(); 
      fs.Close(); 
      sr.Dispose(); 
      fs.Dispose(); 
     } 

     static void ShowOptions() 
     { 
      Console.WriteLine("usage: SQLCSVExport {dbtable | query} {out | queryout} datafile"); 
      Console.WriteLine("[-q quote string fields]   [-S Server Name]  [-U User Name]"); 
      Console.WriteLine("[-P Password]     [-T Trusted Connection] [-t field terminator]"); 
      Console.WriteLine("[-H Add Headings]"); 
     } 
    } 
} 
1

L'outil intégré qui fait cela est SSIS, même si je comprends que ce pourrait être un « plus lourd » solution que vous voulez et ce n'est pas entièrement pris en charge Express Edition (vous ne l'avez pas mentionné soit la version ou édition que vous utilisez). Vous pouvez définir un qualificatif de texte dans le package flat file connection manager.

Vous pouvez également écrire un petit script dans votre langage de script préféré.

+0

Pas si familier avec SSIS, pouvez-vous exécuter une requête à exporter vers un fichier texte sans créer un paquet en premier? – Jaques

+0

Non, SSIS est basé sur un paquet, vous ne pouvez donc pas en éviter un. Personnellement, si je ne pouvais pas utiliser SSIS, j'utiliserais un langage qui a déjà le support de la bibliothèque CSV (comme Perl ou Python) car il est plus difficile que d'écrire des fichiers CSV. Votre code ne semble pas gérer le cas où une chaîne contient des guillemets, par exemple. – Pondlife

Questions connexes