2012-06-12 3 views
1

모두 큰 SQL 테이블의 데이터 집합을 .txt 파일로 작성해야합니다. 이렇게하려면 xp_cmdshell을 사용하도록 선택했습니다. 나는 데이터 .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 쿼리를 실행하고 쿼리 길이의 오류를 없애기로 결정했습니다. 나는 다음과 같은 쿼리 'tmpTestQuery.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 

을 시도,하지만 난 원격 연결이 활성화

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 명령에서 해당 개체를 쿼리하도록하십시오.

localhost 대괄호로 인해 SQLCMD가 작동하지 않을 수 있습니다. 시도 :

... 
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

명령 줄에서 실행하고 있지 않습니다. 나는 그 이름을 완전히 자격을 얻으려고 노력했지만 아무런 효과가 없다. 이 [일반적으로 숨겨진 SQL] 오류가 발생하는 이유에 대해 더 이상 생각이 있습니까? 시간 내 주셔서 다시 한번 감사드립니다. – MoonKnight

1

할 수 있습니다 글로벌 임시 테이블에 원하는 데이터 (##temp_table)를 삽입 한 다음 소스로 사용하십시오 BCP 제한이 주위에보기에서 복잡한 쿼리를 래핑하는 얻을

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