Este procedimento irá gerar um arquivo CSV com a saída da consulta que você passa como parâmetro. O segundo parâmetro é o nome do seu arquivo CSV, certifique-se de passar o nome do arquivo com um caminho gravável válido.
Aqui está o script para criar o procedimento:
CREATE procedure [dbo].[usp_create_csv_file_from_query]
@sql Nvarchar(MAX),
@csvfile Nvarchar(200)
as
BEGIN
if IsNull(@sql,'') = '' or IsNull(@csvfile,'') = ''
begin
RAISERROR ('Invalid SQL/CsvFile values passed!; Aborting...', 0, 1) WITH NOWAIT
return
end
DROP TABLE if exists global_temp_CSVtable;
declare
@columnList varchar(4000),
@columnList1 varchar(4000),
@sqlcmd varchar(4000),
@dos_cmd nvarchar(4000)
set @sqlcmd = replace(@sql, 'from', 'into global_temp_CSVtable from')
EXECUTE (@sqlcmd);
declare @cols table (i int identity, colname varchar(100))
insert into @cols
select column_name
from information_schema.COLUMNS
where TABLE_NAME = 'global_temp_CSVtable'
declare @i int, @maxi int
select @i = 1, @maxi = MAX(i) from @cols
while(@i <= @maxi)
begin
select @sql = 'alter table global_temp_CSVtable alter column [' + colname + '] VARCHAR(max) NULL'
from @cols
where i = @i
exec sp_executesql @sql
select @i = @i + 1
end
SELECT
@columnList = COALESCE(@columnList + ''', ''', '') + column_name
,@columnList1 = COALESCE(@columnList1 + ', ', '') + column_name
from information_schema.columns
where table_name = 'global_temp_CSVtable'
ORDER BY ORDINAL_POSITION;
SELECT @columnList = '''' + @columnList + '''';
SELECT @dos_cmd='BCP "SELECT ' + @columnList +
' UNION ALL ' +
'SELECT * from ' + db_name() + '..global_temp_CSVtable" ' +
'QUERYOUT ' + @csvfile +
' -c -t, -T'
exec master.dbo.xp_cmdshell @dos_cmd, No_output
DROP TABLE if exists global_temp_CSVtable;
end