我正在尝试将数据从 sql server 表导出到 csv 文件而不使用 ssms。
我试图通过使用 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)我想要给定数据库中所有表的结果。那么如何做到这一点?
请尽快给出建议或解决方案
谢谢
仅我知道的解决方法...
查询数据字典并生成csv字段列表,然后 将 header.csv 与 data.csv 连接起来。这将查询列表,但您需要小心生成要匹配的 SQL,因为您希望消除列列表与数据不匹配的所有可能性。
创建一个视图,其中第一行具有所有字段名称
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();
}
}
}
}
}
}
}