Microsoft SQL Server
Transact-SQL

Вывод во внешний файл результатов запроса

Опубликовано: 30 сен 02
Рейтинг:

Автор: Glory
Прислал: Glory

Каким образом на T-SQL организовать запись во внешний файл.

1-ый вариант

DECLARE @result int

EXEC @result = master..xp_cmdshell 'osql -S MYSQLSERVER -E -Q "SELECT TOP 10 * FROM pubs.dbo.authors" -b -o c:\myoutput.txt', no_output
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'


2-ой вариант
DECLARE @FileName varchar(255), 
@Text1 varchar(8000),
@FS int, 
@OLEResult int, 
@FileID int, 
@hr int,
@source varchar(30), 
@desc varchar (200)

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT

IF @OLEResult <> 0 
BEGIN
PRINT 'Scripting.FileSystemObject'
GOTO Error_Handler
END

execute @OLEResult = sp_OAMethod @FS,'CreateTextFile',@FileID OUTPUT, 'c:\xxx.txt'
IF @OLEResult <> 0 
BEGIN
PRINT 'CreateTextFile'
GOTO Error_Handler
END

set @Text1 = 'blah-blah-blah' + char(0)
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1
IF @OLEResult <> 0 
BEGIN
PRINT 'WriteLine'
GOTO Error_Handler
END

Print @Text1
goto Done

Error_Handler: 
PRINT '*** ERROR ***'
EXEC @hr = sp_OAGetErrorInfo null, @source OUT, @desc OUT
SELECT hr = CONVERT (binary(4), @hr), source = @source, description = @desc

Done:
EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS



3-ий и IMHO самый правильный вариант - DTS Package

Примечание
2-ой варианте по неизвестным мне причинам может не работать (кажется только в MS SQL7 и/или на WInNT4).
Возможно проблема решается установкой последнего последней версией WSH.
Возможно нет.

Комментарии


  • а куда и как во втором способе вписывать сам запрос?

  • По первому варианту можно переписать, например, вот так:
    osql -S Dmitry\F2000SQL -E -s; -w2048 -Q "SELECT TOP 10 * FROM foliobase.dbo.scl_artc" -b -o c:\myoutput.txt
    т.е. добавть опцию -w2048 (на самом деле - ширина строки) и опцию -s; (разделитель - точка с запятой).
    Там ещё есть параметры, которыми можно поиграться.
    Работает на MSDE-2000 и 2005 StandardEdition.

  • вот так можно получить стандартнйы формат с табуляцией в качестве разделителя:

    DECLARE @Sql VARCHAR(4000),
    @result int
    SET @Sql='sqlcmd -S SQL1\SQL2008 -E -h -1 -Q "SELECT * from INFORMATION_SCHEMA.TABLES" -o c:\1.txt -u -W -s "' + CHAR(9)+'"'

    EXEC @result = master..xp_cmdshell @Sql, no_output

  • первый метод - в файле полная галиматья

  • второй метод - то, что искал

  • 26 августа 2008, 11:25 Новиков Юрий

    Спасибо! Великолепное решение!

  • 2-й метод понравился.
    Работает если у пользователя есть права на создание OLE объектов.



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Transact-SQL / Вывод во внешний файл результатов запроса