使用SQL Server Agent导出SQL Server CSV文件Powershell

本文关键字:SQL Server 文件 Powershell CSV Agent 使用 导出 | 更新日期: 2023-09-27 18:15:24

我使用xp_cmdshell找到了这个答案

SQL Server Agent作业-将结果导出到以制表符分隔的文件?

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

是否有人曾处理过这种情况,并愿意分享脚本+经验?

可以用c#编写控制台应用程序(或者在我弄清楚如何完成后通过power shell调用的类)。遵循最简单、最自由的方式前进。

顺便说一句:我最后一次使用xp_cmdshell时,由于权限的问题而陷入困境。上次我不得不教一个系统管理员如何通过电子邮件做到这一点,并通过不同时区的电子邮件解决他们的锁定设置。因此我有一些内在的犹豫;-)。谢天谢地,在这种情况下我可以自由支配。

使用SQL Server Agent导出SQL Server CSV文件Powershell

你能试试吗?:

如果您希望它作为一个存储过程,其中可以手动或编程地传递日期:

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

上面的

也可以放在存储过程中,这完全取决于您想怎么做。

我建议在担心SQL Agent之前先解决如何生成CSV的问题。然后可以在SQL Agent中调度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代理中工作,就像在Powershell控制台中一样。你需要设置一个Powershell作业步骤。

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

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