簡體   English   中英

將帶有列名的 sql 表數據導出到 csv 文件

[英]export sql table data with column names to csv file

我正在嘗試將數據從 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)我想要給定數據庫中所有表的這個結果。 那么該怎么做呢?

請盡快給出一些建議或解決方案

謝謝

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

  1. 查詢數據字典並生成一個 csv 字段列表,然后將 header.csv 與 data.csv 連接起來。 這將查詢列表,但您需要注意生成要匹配的 SQL,因為您要刪除列列表與數據不匹配的所有可能性。

  2. 創建一個視圖,第一行的所有字段名稱union all與數據的選擇結合在一起。

就像是:

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

不過,這可能需要對日期進行類型轉換。

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

@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命令將數據添加到已經包含列列表的文件中,並刪除了不再需要數據的文件。

隨意修改和弄亂它,如果遇到任何問題,請告訴我。

如果您想要帶有 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();
                            }
                        }
                    }
                }
            }
        }
    }
  • 安裝包 ClosedXML -版本 0.92.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM