存储过程执行后,将Sql查询结果转换为CSV到指定的文件路径
我正在尝试执行一个存储过程,我知道它在T-SQL中工作,然后将这些结果获取到一个CSV文件中,并将该文件放入一个目录中。不过,我不知道该如何表述这个问题。以下是迄今为止我尝试过但没有成功的方法:存储过程执行后,将Sql查询结果转换为CSV到指定的文件路径,sql,csv,directory,export,Sql,Csv,Directory,Export,我正在尝试执行一个存储过程,我知道它在T-SQL中工作,然后将这些结果获取到一个CSV文件中,并将该文件放入一个目录中。不过,我不知道该如何表述这个问题。以下是迄今为止我尝试过但没有成功的方法: EXECUTE CLR_ExportQueryToCSV @QueryCommand = 'execute databaseName.dbo.StoredProcedureName', @FilePath = 'C:\Directory',
EXECUTE CLR_ExportQueryToCSV @QueryCommand = 'execute databaseName.dbo.StoredProcedureName',
@FilePath = 'C:\Directory',
@FileName = '\FileToExport.csv',
@IncludeHeaders = 1
我意识到CLR\u ExportQueryToCSV不存在。是否有任何系统存储过程可以满足我的要求?不幸的是,SQL Server中没有通用/受支持的方法来满足您的要求 如果您只是想寻找一种将SQL查询结果转储到CSV的方法,那么我更倾向于编写SSIS包来完成这项工作,或者编写一个C控制台应用程序,两者都可以安排 下面是C语言中的一个示例:
static void Main(string[] args)
{
WriteQueryResultsToCsv(@"c:\SqlResults.csv",
"MyDbConnectionStringName",
"select * from MyTable where x > @x",
new SqlParameter("@x", SqlDbType.Int) {Value = 1});
}
private static void WriteQueryResultsToCsv(string csvPath, string connectionStringName, string sql, params SqlParameter[] parameters)
{
// Requires reference to System.Configuration
var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
using (var db = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(sql, db))
{
db.Open();
cmd.Parameters.AddRange(parameters);
using (var dr = cmd.ExecuteReader())
using (var dw = new StreamWriter(csvPath))
using (var csv = new CsvWriter(dw)) // Requires CsvHelper package from NuGet
{
// Write column headers
for (var c = 0; c < dr.FieldCount; c++)
csv.WriteField(dr.GetName(c));
// Write data rows
while (dr.Read())
{
csv.NextRecord();
for (var c = 0; c < dr.FieldCount; c++)
{
csv.WriteField(dr.GetValue(c).ToString());
}
}
}
}
}
在SQL中有一种方法可以满足您的要求,但它并不整洁,也不受AFAIK的支持
EXEC xp_cmdshell 'SQLCMD -S . -d MyDatabase -Q "select * from MyTable" -s "," -o "\\servername\output\result.csv" -W'
您可以找到SQLCMD的文档,但基本上是使用xp_cmdshell SP在服务器上执行SQLCMD命令行实用程序,并执行sql语句,将输出传输到CSV文件
我使用的参数如下:
-S: SQL Server name - . means current server
-d: database name
-Q: run SQL query and exit
-s: column separator
-o: output file. This is relative to the SQL Server, not your PC
-W: dynamic column witdth
默认情况下,SQL Server不允许您运行xp_cmdshell,因此您可能需要运行以下SQL才能启用它
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
调用CMD是实现它的一种方法,它可以自动执行
Declare @sql VARCHAR(max)
declare @CsvFile NVARCHAR(500)
DECLARE @cmd NVARCHAR(4000)
set @sql = 'Exec [dbo].[Usp_CSVextract]'
set @CsvFile = 'C:\Test.csv'
SET @cmd =
'bcp '+CHAR(34)+@sql+CHAR(34)+' queryout '+CHAR(34)+@CsvFile+CHAR(34)+' -S '+@@servername
+' -c -t'+CHAR(34)+','+CHAR(34)+' -r'+CHAR(34)+'\n'+CHAR(34)+' -T'
exec master.dbo.xp_cmdshell @cmd
我发现你最好的选择是使用SSIS。创建执行SQL任务并运行存储过程。然后创建一组任务数据流,将数据从临时数据表移动到CSV文件 在此网站上搜索如何制作SSIS包。关于如何做到这一点,有几个非常好的例子 祝你好运。CLR\u ExportQueryToCSV位于
您需要在d sql server上创建DTS包吗?谢谢您的建议。我曾多次使用C编写此功能,但我的任务是通过Sql Server代理来完成,而不是编写任何C代码。再次感谢你的帮助!最后我意识到我可以毫无疑问地做上述陈述。谢谢你的建议!注意:查询结果将转到运行SQL的服务器的本地驱动器。
Declare @sql VARCHAR(max)
declare @CsvFile NVARCHAR(500)
DECLARE @cmd NVARCHAR(4000)
set @sql = 'Exec [dbo].[Usp_CSVextract]'
set @CsvFile = 'C:\Test.csv'
SET @cmd =
'bcp '+CHAR(34)+@sql+CHAR(34)+' queryout '+CHAR(34)+@CsvFile+CHAR(34)+' -S '+@@servername
+' -c -t'+CHAR(34)+','+CHAR(34)+' -r'+CHAR(34)+'\n'+CHAR(34)+' -T'
exec master.dbo.xp_cmdshell @cmd