我花了一整天时间在网上搜索答案。显然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
在命令提示符下完美运行
这条路线的第一行是:
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT
@hr给出0这样好,但@objFileSystem得到16711422,@ hr最终变成-2146828218,我认为是权限。
我真的很难找到一些简单的事情但是我已经让自己变得越来越难以找到一些具体的东西,只是在添加一个新行并重复这个过程之前连续写入几个变量。 / p>
如果有人能够熟练地帮助我弄清楚BCP或sp_OACreate那么我会非常感激因为网络几乎没有帮助(这是在我花了很多时间通过微软自己的网站寻找答案之后)
答案 0 :(得分:1)
您的BCP无法正常工作的原因是因为您是从xp_cmdshell与受信任的用户一起运行它。 xp_cmdshell不在运行脚本的用户下运行。您可以a)更改您的bcp命令以使用sql登录/密码或b)创建一个作业来运行它(而不是xp_cmdshell),因为您可以通过使用run as和凭证来控制它运行的用户。然后,您可以使用sp_start_job在脚本中启动作业。
另一个好的选择是创建一个SSIS包,然后通过命令行运行它(比如在bat文件中)或者再次运行它。
答案 1 :(得分:1)
创建查询视图,然后使用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
删除受影响页脚的行
答案 2 :(得分:0)
你可以使用它在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