Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL写入文件txt或csv_Sql Server_Tsql_File Io_Ole_Bcp - Fatal编程技术网

Sql server T-SQL写入文件txt或csv

Sql server T-SQL写入文件txt或csv,sql-server,tsql,file-io,ole,bcp,Sql Server,Tsql,File Io,Ole,Bcp,我花了一整天的时间在网上搜寻答案。显然,tsql没有自己漂亮的文件写入命令。这就是我的困境 我有一个加载文件,我正在创建一个单线可以达到10K+的长度。在SQL Server上,varchar(最大)限制是8000(所以我相信),所以我将这些行分解为几个变量。我试着打印,但窗格已显示。解决方法是一次一个变量地打印那些虚线,但这对于手工劳动来说会很繁琐,所以我选择将其写入txt文件,一次一个变量 我通过xpcommandshell研究了BCP,它看起来很有希望。问题是我可以让这一行在命令提示符下工

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

我有一个加载文件,我正在创建一个单线可以达到10K+的长度。在SQL Server上,varchar(最大)限制是8000(所以我相信),所以我将这些行分解为几个变量。我试着打印,但窗格已显示。解决方法是一次一个变量地打印那些虚线,但这对于手工劳动来说会很繁琐,所以我选择将其写入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\u DB“从dbo.t\u TagBuild\u set“queryout”Desktop\LAMB\dummy.txt“-c-t,-t中选择名称”
在命令提示符下运行良好

尽管取得了一些进展,但我的经理不想走这条路。因此,在通过在SQL上执行以下行启用sp_配置后,我选择了sp_OACreate和sp_OAMethod: sp_配置“Ole自动化过程”,1

这条路线的第一条线路之一是:

EXECUTE @hr = sp_OACreate  'Scripting.FileSystemObject' , @objFileSystem OUT
@hr给出了一个0,这很好,但是@objFileSystem得到16711422,@hr最终变成了-2146828218,我相信这就是权限

我真的很难找到简单的方法,但我已经让自己越来越难以找到具体的方法,在添加新行并重复这个过程之前,只需在一行中写入几个变量


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

你的BCP不起作用的原因是因为你在xp_cmdshell上用一个受信任的用户运行它。xp\u cmdshell未在运行脚本的用户下运行。您可以a)更改bcp命令以使用sql登录/密码,或者b)创建作业以运行它(而不是xp_cmdshell),因为您可以通过使用运行方式和凭据来控制运行它的用户。然后,可以使用sp_start_job在脚本中启动作业


另一个好的选择是创建SSIS包,然后通过命令行(比如在bat文件中)运行它,或者再次通过作业运行它。

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

您可以使用此命令在T-SQL上写入文件(它工作在触发器中):

--字符(9)=\t


varchar(max)
是“无限制的”
varchar(n)
仅限于n我的经理不想这样做。你的经理有什么问题?SSI是否可以满足您的需要,或者您的经理是否也会拒绝?还有,为什么要和FSO乱搞?如果您打算这样做,您不妨编写一个技术上有2gbI限制的varchar(max),并进一步考虑sp_OACreate中的权限问题。我尝试并创建了一个文件夹C:\TestOutput。我转到安全属性,让每个人都完全控制,并删除了只读复选框。我改变了文件路径,改为转到那个位置,现在它可以工作了。现在我意识到权限问题不是我,而是服务器本身试图写入一个它没有权限的文件夹。@John M我可以帮你吗?可能该文件夹需要从mssqlserver或任何服务用户访问。
    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