2013-02-14 134 views
3

我花了整整一天在網上搜索答案。顯然tsql沒有自己的漂亮的寫入文件命令。這裏是我的困境T-SQL寫入文件txt或csv

我有我創建在一個單一的線其長度可達10K +負載文件。在SQL Server varchar(MAX)的限制是8000(所以我相信),所以我把這些行分成幾個變量。我試圖做PRINT,但窗口窗格允許4000.解決方法是每次打印一個變量的虛線,但這對於手動勞動可能會很乏味,所以我選擇將它寫入一個txt文件中的一個變量時間。

我通過xpcommandshell看着BCP,它看起來很有希望。問題是,我能得到這條線的命令提示符下工作,然而這完全一樣的線不上TSQL查詢工作:

declare @cmd varchar(8000) 
select @cmd = 'bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T' 
exec master..xp_cmdshell @cmd 

bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T作品在命令提示符下

完全正常的,儘管這種輕微的進展,我的經理不想走那條路。所以不是我選擇了由sp_OACreate和sp_OAMethod將向通過執行上的SQL該行實現的sp_configure後: sp_configure的「OLE自動化過程」,1

一個這條路線在第一個行是這樣的:

EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT 

@hr給出了0,所以這很好,但@objFileSystem得出16711422,@hr最終成爲-2146828218,我相信這是權限。

我真的很難找到簡單的事情,但我已經越來越難以找到具體的東西,只需在添加一個新行並重復該過程之前寫入一對變量。

如果任何人都可以熟練地幫我找出BCP由sp_OACreate或然後我會因網非常感激的是幾乎沒有幫助(這是後我花了很多時間通過微軟尋找自己的網站一個答案)

+2

'VARCHAR(最大)'是 「無限制」。'varchar(n)'限於n <= 8000。 – 2013-02-14 22:51:35

+1

*我的經理不想走這條路。*你的經理有什麼問題? SSIS能做你需要的東西嗎?或者你的經理尼克斯能做到這一點嗎?還有爲什麼要使用FSO搞亂?如果你打算這麼做,你可以寫一個[CLR程序集](http://msdn.microsoft.com/en-us/library/ms254956%28v=VS.80%29.aspx) – 2013-02-14 22:57:57

+0

Technically varchar(最大)有一個2GB的限制 – 2013-02-14 23:03:59

回答

1

您的BCP無法正常工作的原因是因爲您是使用受信任的用戶從xp_cmdshell運行它的。運行腳本的用戶不運行xp_cmdshell。您可以a)更改您的bcp命令以使用sql登錄名/密碼或b)創建一個作業來運行它(而不是xp_cmdshell),因爲您可以使用run as和憑據來控制運行它的用戶。然後可以使用sp_start_job在腳本內啓動作業。

你的其他好的選擇是創建一個SSIS包,要麼通過命令行(在一個bat文件說)運行,或再通過工作運行它。

0

創建查詢的視圖,並使用sqlcmd選擇它。

declare @cmd varchar(8000) 
select @cmd = 'sqlcmd -h-1 -W -S servername -d database -U username -P password -Q "SET NOCOUNT ON; select * from VIEW_NAME " -o "C:\OUTPUT\query.csv" ' 
exec master..xp_cmdshell @cmd 

-h-1去除頭

SET NOCOUNT ON消除影響頁腳

0

行您可以編寫使用這個(它的工作原理爲觸發)對T-SQL到文件:

--char (9)= \噸

DECLARE @filename nvarchar(1000); 

    SET @filename = ' (echo '[email protected]+ char(9) [email protected]+ ... + char(9) [email protected]+') > e:\file1.txt && type e:\file1.txt >> e:\file2.txt'; 

    exec DatabaseName..xp_cmdshell @filename, no_output 
+0

@John M我可以幫你嗎? – 2015-08-03 02:03:09

+0

我試過了,我得到「訪問被拒絕」 – 2016-06-20 20:49:06