2013-02-14 161 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