存储过程执行后,将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',

我正在尝试执行一个存储过程,我知道它在T-SQL中工作,然后将这些结果获取到一个CSV文件中,并将该文件放入一个目录中。不过,我不知道该如何表述这个问题。以下是迄今为止我尝试过但没有成功的方法:

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