2012-06-12 4 views
1

Все, мне нужно написать набор данных из большой таблицы SQL в .txt-файл. Для этого я решил использовать xp_cmdshell. Запросом я использую для создания файла data.txt являетсяxp_cmdshell Длина запроса слишком большая

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

Один из способов обойти ограничение BCP, чтобы обернуть сложный запрос в представлении или хранимую процедуры, тогда запрос BCP запросит этот объект.

Возможно, ваш SQLCMD не работает из-за скобок вокруг localhost. Попробуйте:

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

Я создал сохраненную процедуру с большим выбором запроса. Я теперь запускаю его, используя 'declare @sql varchar (8000) select @sql = 'bcp" EXEC ispsCreateDrgData; " queryout "M: \\ Nhcdc \\ R14TData \\ DRGData.txt" -c -t -T -S '+ @@ servername exec master..xp_cmdshell @ sql', но он не распознает мои sp' ispsCreateDrgData ', что я делаю неправильно здесь? – MoonKnight

+0

@ Killercam - bcp подключится к базе данных по умолчанию для входа. Попробуйте полностью определить имя SP ('dbname.schemaname.ispsCreateDrgData'), или если вы находитесь в SQL 2008, укажите имя базы данных в командной строке с флагом' -d'. –

+0

Я не бегу из командной строки. Я попытался полностью квалифицировать имя, и это не имеет никакого значения. У вас больше нет идей относительно того, почему я получаю эту ошибку [обычно cryptic SQL]? Еще раз спасибо за ваше время. – MoonKnight

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 
+0

Это не вариант из-за размером сдвига набора данных, однако, мы рассмотрели записи на «временные» таблицы (не - ## TempTable), затем удалить это впоследствии. Он остается альтернативным вариантом. Спасибо за ваше время ... – MoonKnight

Смежные вопросы