如何在SQL Server查询中将多个select语句导出到不同的csv文件

时间:2016-01-20 15:01:25

标签: sql sql-server

我有一个很长的SQL服务器查询,它运行在不同的表上,进行一些预处理并吐出不同的选择表输出。我希望它们存储在不同的csv文件中。

简化例如。

-- some declare variables and other pre-processing,
-- then save the outputs to different CSV files
select * from Table1 -- save to Table1_Output.csv
select * from Table2 -- save to Table2_Output.csv

现在,我可以使用this运行SQLCmd并将单个select语句的输出保存到单个CSV。我需要能够将各种输出保存到不同的CSV

上述解决方案中的第一个选项不可行,因为这需要手动干预,不能在脚本环境中使用。

由于

3 个答案:

答案 0 :(得分:5)

就个人而言,如果您不能使用SSIS,我只会使用PowerShell:

$SQLServer = 'SQLSERVERNAME';
# If you have a non-default instance such as with SQL Express, use this format
# $SQLServer = 'SQLSERVERNAME\SQLINSTANCENAME';
$Database = 'MyDatabase';

$ConnectionString = "Data Source={0};Initial Catalog={1};Integrated Security=SSPI" -f $SQLServer, $Database;
$CommandText = @'
DECLARE @ID int;
SET @ID  = 123456;
SELECT ID, First_Name FROM dbo.Person WHERE ID = @ID;
SELECT ID, Last_Name FROM dbo.Person WHERE ID = @ID;
'@;

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = $ConnectionString;

$SqlCommand = New-Object System.Data.SqlClient.SqlCommand;
$SqlCommand.CommandText = $CommandText;
$SqlCommand.Connection = $SqlConnection;

$SqlDataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlDataAdapter.SelectCommand = $SqlCommand;

$DataSet = New-Object System.Data.DataSet;

$SqlConnection.Open();
$SqlDataAdapter.Fill($DataSet) | Out-Null;
$SqlConnection.Close();
$SqlConnection.Dispose();

$DataSet.Tables[0] | Export-Csv -NoTypeInformation -Path 'U:\FirstNames.csv';
$DataSet.Tables[1] | Export-Csv -NoTypeInformation -Path 'U:\LastNames.csv';

答案 1 :(得分:2)

返回多个结果时,sqlcmd会在批处理中的每个结果集之间打印一个空行。然后可以使用sed '/^$/q'csplit -s - '/^$/' '{*}'处理输出,以拆分为单个文件:How to split file on first empty line in a portable way in shell

UPD 如果sygwin不是一个选项,则自定义VBScript可以通过WScript.CreateObject("WScript.Shell") .Exec运行sqlcmd,并逐行处理.StdOut.ReadLine()的输出,直到{{ 1}}:Getting command line output in VBScript (without writing to files)

答案 2 :(得分:1)

另一种方法是使用SSIS。 SQL Server Integration Services是在数据库中,数据库内外传输数据的绝佳工具。如果您希望自动化,使用SQL Agent也可以轻松安排SSIS包。

这需要更多的努力。您需要将现有批处理分成几个较小的SQL语句。