Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Процедура выгрузки в файл  [new]
sv.alex
Member

Откуда: Новосибирск
Сообщений: 90
Доброго времени суток.
Выкладываю свою версию выгрузки результатов запроса во внешний файл.
Для начала результат нужно сохранить в таблицу. далее запустить вот эту процедуру.

alter procedure dbo.tablexport @tablename as varchar(80) as
set nocount on
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
select @FileName='\\FARM\WORK\_TEMP_\'+replace(suser_sname(),'nsk\','')+'.xls'
execute @OLEResult = sp_OAMethod @FS,'CreateTextFile',@FileID OUTPUT, @FileName

IF @OLEResult <> 0
BEGIN
PRINT 'CreateTextFile'
GOTO Error_Handler
END
select @Text1=''

declare @Columns varchar(8000), @Values varchar(8000)
declare @Text varchar(8000), @SQL varchar(8000)
select @Columns = '',
@Values = ''
select @Columns = @Columns + '[' + Column_Name + '],',
@Values = @Values + case
when Data_Type like '%time%' then 'isnull( convert(varchar(10), [' + Column_Name + '], 104), '''')'+'+char(9)'
when Data_Type like '%rchar%' then 'isnull(rtrim([' + Column_Name + ']),''l'')'+'+char(9)'
when Data_Type like '%char%' then 'rtrim(isnull('''''''' + [' + Column_Name + ']) '''''''', ''" )'+'+char(9)'
else 'isnull(cast([' + Column_Name + '] as varchar), '''')' +'+char(9)'
end +'+'
from INFORMATION_SCHEMA.[Columns]
where [Table_Name] = @TableName and table_schema='dbo' and
(Data_Type not like '%text%' and Data_Type not like '%image%' and Data_Type not like '%uniq%')
order by [Ordinal_Position]



select @Values=left(@Values,len(@Values)-1)

set @SQL = 'declare Curs cursor fast_forward for select '

set @SQL = @SQL + ''+ @Values + ' from ' + @TableName + ' (nolock)'
set @Text1=replace(@Columns,',',char(9))+char(13)

exec (@SQL)

open Curs
fetch next from Curs into @Text
while @@fetch_status = 0 begin
if len(@Text1)+len(@Text)>=8000 goto do
beg:
set @Text1=@Text1+@Text+char(13)
fetch next from Curs into @Text

end
deallocate Curs

do:
select @Text1=left(@Text1,len(@Text1)-1)
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', NULL, @Text1

if @@fetch_status = 0 begin set @Text1='' goto beg end

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
print 'Готово. Файл находится по адресу: '+@filename
GO

Модератор: Тема перенесена из форума "Visual Basic".


Сообщение было отредактировано: 3 дек 09, 11:18
3 дек 09, 07:08    [8011686]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить