6

我花了一整天的时间在网上搜索答案。显然 tsql 没有自己漂亮的写入文件命令。这是我的困境

我有一个正在创建的加载文件,其中单行的长度可以达到 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在命令提示符下工作得很好

尽管取得了微小的进步,但我的经理并不想走那条路。因此,通过在 SQL 上执行此行启用 sp_configure 后,我选择了 sp_OACreate 和 sp_OAMethod: sp_configure 'Ole Automation Procedures', 1

这条路线的第一行是这样的:

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

@hr 给出一个 0 ,这很好,但 @objFileSystem 产生 16711422 并且 @hr 最终变成 -2146828218 我相信这是权限。

我真的很茫然找不到简单的事情,但我自己越来越难以找到具体的事情,只是在添加新行并重复该过程之前连续写入几个变量。

如果有人能熟练地帮助我找出 BCP 或 sp_OACreate,那么我将非常感激,因为网络几乎没有帮助(这是在我花了很多时间浏览微软自己的网站寻找答案之后)

4

3 回答 3

2

创建查询视图并使用 选择它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删除受影响的页脚行

于 2013-08-20T22:53:57.703 回答
2

您的 BCP 不起作用的原因是您从 xp_cmdshell 与受信任的用户一起运行它。xp_cmdshell 不在运行脚本的用户下运行。您可以 a) 更改您的 bcp 命令以使用 sql 登录名/密码或 b) 创建一个作业来运行它(不是 xp_cmdshell),因为您可以通过使用 run as 和凭据来控制它以什么用户身份运行。然后,您可以使用 sp_start_job 在脚本中启动该作业。

您的另一个不错的选择是创建一个 SSIS 包并通过命令行运行它(比如在 bat 文件中)或再次通过作业运行它。

于 2013-02-14T23:10:41.353 回答
1

您可以使用此方法在 T-SQL 上写入文件(它适用于触发器):

--char(9) = \t

    DECLARE @filename nvarchar(1000);

    SET @filename = ' (echo '+@parameterA+ char(9) +@parameterB+ ... + char(9) +@ParameterN+') > e:\file1.txt && type e:\file1.txt >> e:\file2.txt';

    exec DatabaseName..xp_cmdshell @filename, no_output
于 2015-07-05T22:42:12.907 回答