SQL Server CSV导出使用SQL Server代理&电源外壳?

时间:2011-11-23 06:42:57

标签: c# sql-server powershell

我使用xp_cmdshell

找到了这个答案

SQL Server Agent Job - Export results to Tab Delimited File?

这对我来说很好,除了我需要为sql查询提供日期参数。日期参数通过另一个SQL查询填充。正在考虑使用PowerShell。

是否有人使用过此方案并愿意分享脚本+体验?

可以在C#中编写控制台应用程序(或者在我弄清楚如何完成后通过电源shell调用的类)。就在最简单,最杂乱无章的前进之后。

顺便说一下:我最后一次使用xp_cmdshell是因为允许挫折而陷入困境。上次我不得不教一个系统管理员如何通过电子邮件+这样做也通过电子邮件在不同的时区解决他们的锁定设置。结果我有一些内在的犹豫;-)。值得庆幸的是,我在这种情况下有了自由的统治权。

2 个答案:

答案 0 :(得分:1)

我建议在担心SQL Agent首先解决如何生成CSV的问题之前。然后,您可以在SQL代理中安排Powershell脚本。这是我测试的一些代码,它使用来自另一个查询的日期参数从SQL查询生成CSV文件:

$orderDate = Invoke-Sqlcmd -ServerInstance "Win7boot\sql1" -Database AdventureWorks -Query "select max(OrderDate) As OrderDate from Sales.SalesOrderHeader" | %{$_.OrderDate} 
Invoke-Sqlcmd -ServerInstance "Win7boot\sql1" -Database AdventureWorks -Query "select * from Sales.SalesOrderHeader where OrderDate < '$orderDate'" | Export-Csv -Path "C:\Users\Public\salesorder.csv" -NoTypeInformation -Force

这应该在SQL Agent中工作,就像在Powershell控制台中一样。您需要设置Powershell作业步骤。

请注意,如果从与主查询相同的服务器实例获取日期参数,您可以将查询合并为一个:

"select * from Sales.SalesOrderHeader where OrderDate < (select max(OrderDate) from Sales.SalesOrderHeader)"

答案 1 :(得分:1)

你能试试吗?:

如果您希望将其作为存储过程,可以手动或以编程方式传递日期:

CREATE PROCEDURE bcp_test_with_date_parameter
    @paramDate DATETIME
AS
BEGIN

    DECLARE @bcpCmd varchar(2000)
    SET @bcpCmd = 'bcp "SELECT * FROM dbname.schema.tablename' 
    SET @bcpCmd = @bcpCmd + 'WHERE CONVERT(VARCHAR, datecolumn, 101) = ''' + CONVERT(VARCHAR, @paramDate, 101) + ''' '
    SET @bcpCmd = @bcpCmd + ' ORDER BY columnnameofchoice" queryout "'
    SET @bcpCmd = @bcpCmd + '"C:\tblNameData.txt" -T -c'

    EXEC master..xp_cmdshell @bcpCmd

END

但是如果你只是想从另一张表中获取日期,你可以使用它:

DECLARE @bcpCmd varchar(2000)
DECLARE @dateHolder DATETIME
SELECT @dateHolder = CONVERT(VARCHAR, datecolumn, 101) 
    FROM dateparametersourcetable
    WHERE <place conditions here>

SET @bcpCmd = 'bcp "SELECT * FROM dbname.schema.tablename' 
SET @bcpCmd = @bcpCmd + 'WHERE CONVERT(VARCHAR, datecolumn, 101) = ''' + @dateHolder + ''' '
SET @bcpCmd = @bcpCmd + ' ORDER BY columnnameofchoice" queryout "'
SET @bcpCmd = @bcpCmd + '"C:\output.txt" -T -c'

EXEC master..xp_cmdshell @bcpCmd

上面的那个也可以放在一个存储过程中,这真的取决于你想要的方式..