将列名称导出到csv文件的sql表数据

时间:2014-05-25 05:22:01

标签: sql csv stored-procedures export

我正在尝试将数据从sql server表导出到没有ssms的csv文件。

我正在尝试通过使用bcp创建存储过程来实现它。

declare @sql nvarchar(4000); select @sql = 'bcp "select * from table" queryout c:\file.csv -c -t, -T -S'+ @@servername exec xp_cmdshell @sql

1)此查询产生预期结果。但我想要的是它还应该包括csv文件中的列名。那我怎么能实现呢?

2)我希望这个结果适用于给定数据库中的所有表。那怎么办?

请尽快提出一些建议或解决方案

感谢

3 个答案:

答案 0 :(得分:0)

只有我知道的解决方法...

  1. 查询数据字典并生成csv字段列表 将header.csv与data.csv连接起来。这将查询columns表,但是您需要注意生成要匹配的SQL,因为您要删除列列表与数据不匹配的任何和所有机会。

  2. 创建一个视图,第一行包含所有字段名union all,并对数据进行选择。

  3. 类似的东西:

    SELECT 'a', 'b', 'c' UNION ALL SELECT a, b, c FROM table
    

    但这可能需要日期的类型转换。

答案 1 :(得分:0)

我建议你做一些事情:

@echo off
bcp "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table_name>' AND TABLE_SCHEMA='<table_schema>'" queryout c:\file.csv -c -r, -T -S <server_name> -d <database_name>
bcp "select * from <table_schema>.<table_name>" queryout c:\data.csv -c -t, -T -S <server_name> -d <database_name>
echo. >> c:\file.csv
type c:\data.csv >> c:\file.csv
del c:\data.csv

.bat文件中。

我认为,对于您想要做的事情,最好只使用批处理文件/命令行中的bcp命令,而不是在SQL Server中启用xp_cmdshell可能会引入安全问题。

此外,我还想指出,我不确定列是否总是以相同的顺序出现(在我的情况下)。

编辑:批处理文件说明。 我基本上运行了2 bcp个命令并将输出发送到2个不同的文件,因为我找不到将输出附加到另一个文件的选项。然后我只使用type命令将数据添加到已经包含列列表的文件中,并删除了不再需要的数据文件。

随意修改并弄乱它,如果遇到任何问题,请告诉我。

答案 2 :(得分:0)

如果您希望列名具有SQL表数据,请尝试使用此代码: -

 public void ExportExcelFileToFolder()
    {
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM MachineMaster"))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        using (XLWorkbook wb = new XLWorkbook())
                        {
                            wb.Worksheets.Add(dt, "SheetName");

                            HttpContext.Current.Response.Clear();
                            HttpContext.Current.Response.Buffer = true;
                            HttpContext.Current.Response.Charset = "";
                            HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=SqlExport.xlsx");
                            using (MemoryStream MyMemoryStream = new MemoryStream())
                            {
                                wb.SaveAs(MyMemoryStream);

                                string fileName = Guid.NewGuid() + ".xlsx";
                                string filePath = Path.Combine(System.Web.Hosting.HostingEnvironment.MapPath("~/ExeclFiles"), fileName);


                                MyMemoryStream.WriteTo(new FileStream(filePath, FileMode.Create));
                                HttpContext.Current.Response.Flush();
                                HttpContext.Current.Response.End();
                            }
                        }
                    }
                }
            }
        }
    }
  • Install-Package ClosedXML -Version 0.92.1