xp_cmdshell查询长度过大

时间:2012-06-12 10:47:32

标签: sql tsql xp-cmdshell

全部,我需要将大型SQL表中的数据集写入.txt文件。为此,我选择使用xp_cmdshell。我用来创建Data.txt文件的查询是

declare @sql varchar(8000) 
select @sql = 'bcp "SELECT /*Lots of field names here*/ ' +
'FROM [SomeDatabase]..TableName WHERE /*Some Long Where Clause*/" ' + 
'queryout "M:\\SomeDir\\SomeOtherDirectory\\Data.txt" -c -t -T -S' + @@servername 
exec master..xp_cmdshell @sql

我遇到的问题是我使用的SELECT查询超出了命令行强加的1024个字符限制。为了解决这个问题,我决定尝试使用sqlcmd尝试从文件中执行我需要的SQL查询,从而消除查询长度的错误。我尝试过以下查询

DECLARE @DatabaseName VARCHAR(255)
DECLARE @cmd VARCHAR(8000)
SET @DatabaseName = 'SomeDatabase' 
SET @CMD = 'SQLCMD -E -S (localhost) -d ' + @DBName + 
    'i "M:\\SomeDir\\SomeOtherDirectory\\tmpTestQuery.sql"' 
EXEC master..xp_cmdshell @CMD 

其中'tmpTestQuery.sql'包含我想要执行的长查询,但是我收到以下错误

HResult 0x2AF9, Level 16, State 1
TCP Provider: No such host is known.
NULL
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-
    specific error has occurred while establishing a connection to SQL Server. 
    Server is not found or not accessible. Check if instance name is correct and 
    if SQL Server is configured to allow remote connections. 
    For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.
NULL

我启用了远程连接。

我想知道我做错了什么,如果在使用xp_cmdshell时我有查询长度的另一种方法吗?

感谢您的时间。

注意。此查询最终将从C#调用,因此计划是将非常长的查询写入临时.txt文件,使用概述的方法执行它并在完成时删除。

2 个答案:

答案 0 :(得分:2)

解决BCP限制的一种方法是将复杂查询包装在视图或存储过程中,然后让BCP命令查询该对象。

由于localhost周围的括号,您的SQLCMD可能无效。尝试:

...
SET @CMD = 'SQLCMD -E -S localhost -d ' + @DBName + 
...

答案 1 :(得分:1)

您可以将所需数据插入全局临时表(##temp_table),然后将其用作源:

declare @sql varchar(8000) 
select @sql = 'bcp "SELECT * FROM ##temp_table" ' + 
'queryout "M:\\SomeDir\\SomeOtherDirectory\\Data.txt" -c -t -T -S' + @@servername 
exec master..xp_cmdshell @sql