1

所有,我需要将一个大型 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 文件,使用概述的方法执行它,完成后删除。

4

2 回答 2

2

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

您的 SQLCMD 可能无法工作,因为localhost. 尝试:

...
SET @CMD = 'SQLCMD -E -S localhost -d ' + @DBName + 
...
于 2012-06-12T10:53:42.317 回答
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
于 2012-06-12T10:51:43.613 回答