2011-11-23 34 views
0

我发现这个答案使用xp_cmdshell的使用SQL Server Agent&Powershell进行SQL Server CSV导出?

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

这会工作得很好,我除了我需要提供日期参数的SQL查询。日期参数通过另一个SQL查询来填充。正在考虑使用PowerShell。

是否有人与此场景合作并愿意共享脚本+体验?

可能在C#中编写控制台应用程序(或者一旦我计算完成后,通过电源外壳调用该类)。就在最简单,最混乱的自由前进之后。

顺便说一句:我最后一次使用xp_cmdshell被许可挫折困扰。上次我必须教一个系统管理员如何通过电子邮件进行操作+还可以在不同的时区通过电子邮件解决他们的锁定设置。因此,我有一些内在的犹豫不决;-)。幸好我在这种情况下有了自由的统治。

回答

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 

在对那个上面也可以放置在存储过程中,它真的取决于你想怎么办呢..

1

我会建议先担心SQL代理首先解决如何生成CSV的问题。然后,您可以在SQL代理中安排Powershell脚本。下面是一些我测试使用Date参数从另一个查询生成从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作业步骤。

注意如果正在从相同的服务器实例获得的Date参数作为主查询,你可以查询合并为一个:

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

有一定的优势在这里 - 脚本可以作为在一个文件中存在OS +链接到svn文件夹中。过去我做过很多存储过程,但这种方法似乎更可取。它看起来非常轻巧。 – sgtz

+0

btw:“%{$ _。OrderDate}”是做什么的?我想首先消化这一点。 – sgtz

+0

%是foreach对象的别名。请参阅get-alias以获取完整的别名列表。 Powershell返回具有属性和方法的对象,但我们只对OrderData属性感兴趣。它所做的是遍历每个对象,即$ _表示管道中的当前对象(在这种情况下只返回一个对象),抓取OrderDate属性并将其分配给$ orderDate变量。 –