2013-02-14 4 views
3

나는 하루 종일 인터넷을 해답에 쏟아 부었다. 분명히 tsql에는 파일 쓰기 명령이 없습니다. 여기 내 딜레마입니다파일 txt 또는 csv에 T-SQL 쓰기

한 줄의 길이가 10K +에 도달 할 수있는 곳의로드 파일이 있습니다. SQL Server varchar (MAX) 제한은 8000입니다 (그래서 저는 믿습니다). 그래서 여러 줄로 나누었습니다. 나는 인쇄를하려고했지만 창문은 4000을 허용했다. 해결 방법은 한 번에 하나의 변수를 파손 된 선을 인쇄하는 것이지만 수동 노동에 지루할 수 있으므로 txt 파일에 하나의 변수를 쓰는 방법을 살펴 보았다. 시각.

나는 xpcommandshell을 통해 BCP를 들여다 보았는데 유망 해 보였다. 이 약간의 진전에도 불구하고 명령 프롬프트

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_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T 작품을 완벽하게 정상적으로 : 문제는 내가이 라인은 아직 정확히 같은 라인 TSQL 쿼리에서 작동하지 않습니다 명령 프롬프트에서 작동하도록 얻을 수 있었다 내 매니저는 그 길을 가고 싶지 않았습니다.

EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT 

:이 경로의 첫 번째 라인의 1

하나는 이것이다, sp_configure를 'OLE 자동화 절차': 그래서 그 대신 내가 SQL에이 줄을 실행을 통해 sp_configure를 활성화 한 후 통해 sp_OACreate 및 sp_OAMethod을 선택했다 @hr는 0을 제공하므로 좋지만 @objFileSystem은 16711422를 산출하고 @hr은 결국 -2146828218이되어 사용 권한이라고 믿습니다.

나는 아직 뭔가하기가 쉽지 않다. 나는 새로운 변수를 추가하고 그 과정을 반복하기 전에 몇 가지 변수에 연속적으로 쓸 구체적인 것을 찾기가 점점 더 어려워지고있다.

아무도 내가 BCP를 알아 내거나 sp_OACreate하는 데 도움이된다면 그다지 도움이되지 못하는만큼 그물을 아주 감사하게 생각할 수 있습니다. (그리고 이것은 마이크로 소프트 자체 사이트를 통해 많은 시간을 보냈습니다.)

+2

'varchar (max)'는 "무제한"입니다.'varchar (n)'은 n <= 8000으로 제한됩니다. –

+1

* 내 매니저가 그 경로를 가고 싶지 않았습니다. * 관리자의 문제는 무엇입니까? SSIS가 당신이 필요로하는 것을 할 수 있습니까, 아니면 당신의 매니저도 마찬가지입니까? 또한 왜 FSO를 사용하는 이유는 무엇입니까? 만약 당신이 그걸로 갈 수 있습니다 [CLR 어셈블리] (http://msdn.microsoft.com/en-us/library/ms254956%28v=VS.80%29.aspx) –

+0

기술적으로 varchar (최대)에는 2GB의 제한이 있습니다. –

답변

1

신뢰할 수있는 사용자와 함께 xp_cmdshell에서 BCP를 실행했기 때문에 BCP가 작동하지 않는 이유가 있습니다. xp_cmdshell은 스크립트를 실행하는 사용자에서 실행되지 않습니다. a) bql 명령을 sql 로그인/암호를 사용하도록 변경하거나 b) run as 및 credential을 사용하여 실행되는 사용자를 제어 할 수 있기 때문에 xp_cmdshell이 ​​아닌 xp_cmdshell을 실행하는 작업을 생성 할 수 있습니다. 그런 다음 sp_start_job을 사용하여 스크립트 내에서 작업을 시작할 수 있습니다.

다른 좋은 옵션은 SSIS 패키지를 만들고 명령 줄 (bat 파일)에서 실행하거나 작업을 통해 다시 실행하는 것입니다.

0

검색어보기를 만들고 sqlcmd을 사용하여 선택하십시오.

--char :

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에 파일에 쓸 수있는 글

0

영향을받는 행을 제거 헤더를 제거합니다 (9) = \ t

DECLARE @filename nvarchar(1000); 

    SET @filename = ' (echo '[email protected]+ char(9) [email protected]+ ... + char(9) [email protected]+') > e:\file1.txt && type e:\file1.txt >> e:\file2.txt'; 

    exec DatabaseName..xp_cmdshell @filename, no_output 
+0

@ John M 도울 수 있어요? –

+0

나는 이것을 시도하고 "액세스가 거부되었습니다." –