【问题标题】:export sql table data with column names to csv file将带有列名的 sql 表数据导出到 csv 文件
【发布时间】:2014-05-25 05:22:01
【问题描述】:

我正在尝试将数据从 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) 我想要给定数据库中所有表的这个结果。那么该怎么做呢?

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

谢谢

【问题讨论】:

  • 您需要使用哪些版本的 SQL Server?
  • 我正在使用 sql server 2008 r2

标签: sql csv stored-procedures export


【解决方案1】:

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

  1. 查询数据字典,生成一个csv字段列表,然后 将 header.csv 与 data.csv 连接起来。这将查询列表,但您需要小心生成要匹配的 SQL,因为您要删除列列表与数据不匹配的所有可能性。

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

类似:

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

不过,这可能需要对日期进行类型转换。

【讨论】:

  • 好的,谢谢你的提示。你能提供第二个选项的任何示例查询吗?
【解决方案2】:

我建议按照以下方式做一些事情:

@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

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

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

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

【讨论】:

    【解决方案3】:

    如果你想要列名和 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2023-01-16
      • 2014-11-19
      相关资源
      最近更新 更多