Este procedimiento generará un archivo CSV con el resultado de la consulta que pase como parámetro. El segundo parámetro es su nombre de archivo CSV, asegúrese de pasar el nombre del archivo con una ruta de escritura válida.
Aquí está el script para crear el procedimiento:
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