2011-11-23 105 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變量。 –