Export to Excel from SQL Server using T-SQL script
This post helps in understanding Export to Excel from SQL Server using T-SQL Script. Typically to export data from sql server to excel we can user varius options :
- Import / Export Wizard
- BCP
- OPENROWSET
Below stored procedure will make the task easier. It provides more flexibility to Export to Excel from SQL Server using T-SQL script. .
USE MASTER
/*** Make sure that the below are enabled on your server ***/
-- Ad Hoc Remote Quires
-- XP_CMDSHELL
***/
/****** Object:StoredProcedure [dbo].[usp_ExportData_Excel]
Script Date: 10/05/2009 08:39:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*** Execution Example
EXEC [usp_ExportData_Excel] @dbName = 'Master',
@sql = 'select * from master.sys.sysdatabases',
@fullFileName = 'D:\Table_Details.xls' ,
@InstanceName ='',
@User = '',
@pwd = ''
***/
CREATE PROC [dbo].[usp_ExportData_Excel]
(
@dbName VARCHAR(100)='master',
@sql VARCHAR(8000)='select * from master.sys.sysdatabases',
@fullFileName VARCHAR(100) = 'D:\Table_Details.xls',
@InstanceName VARCHAR(100) = '',
@User VARCHAR(20) = '',
@Pwd VARCHAR(20) = ''
)
AS
BEGIN
SET NOCOUNT ON
IF @sql =''or @fullFileName =''
BEGIN
SELECT 0 AS ReturnValue -- failure
RETURN
END
-- if DB isn't passed in set it to master
SELECT @dbName ='use '+ @dbName +';'
IF object_id('##TempExportData') is not null
DROP TABLE ##TempExportData
IF object_id('##TempExportData2') is not null
DROP TABLE ##TempExportData2
-- insert data into a global temp table
DECLARE @columnNames VARCHAR(8000),
@columnConvert VARCHAR(8000),
@tempSQL VARCHAR(8000)
SELECT @tempSQL = left(@sql, charindex('from', @sql)-1) +
' into ##TempExportData '+
substring(@sql,charindex('from', @sql)-1,len(@sql))
EXEC(@dbName + @tempSQL)
IF @@error > 0
BEGIN
SELECT 0 AS ReturnValue -- failure
RETURN
END
-- build 2 lists
-- 1. column names
-- 2. columns converted to nvarchar
SELECT @columnNames =COALESCE( @columnNames +',','')+ column_name,
@columnConvert =COALESCE( @columnConvert +',','')+'convert(nvarchar(4000),'
+ column_name + case when data_type in('datetime','smalldatetime')then',121'
WHEN data_type in('numeric','decimal')then',128'
WHEN data_type in('float','real','money','smallmoney')then',2'
WHEN data_type in('datetime','smalldatetime')then',120'
ELSE ''
END + ') as ' + column_name
FROM tempdb.INFORMATION_SCHEMA.Columns
WHERE table_name ='##TempExportData'
-- execute select query to insert data and column names into new temp table
SELECT @sql = 'select ' + @columnNames + ' into ##TempExportData2 from
(select ' + @columnConvert + ', ''2'' as [temp##SortID] from ##TempExportData
union all select ''' + replace(@columnNames, ',', ''', ''') + ''', ''1'') t
order by [temp##SortID]'
exec (@sql)
-- BUILD FULL BCP QUERY
DECLARE @bcpCommand VARCHAR(8000)
SET @bcpCommand ='bcp " SELECT * from ##TempExportData2" queryout'
SET @bcpCommand = @bcpCommand +' '+@fullFileName+' -S'+
@InstanceName+' -c -w -T -U '+@User+' -P '+@pwd+'","-CRAW'
EXEC master..xp_cmdshell @bcpCommand
IF @@ERROR > 0
BEGIN
SELECT 0 AS ReturnValue -- failure
RETURN
END
DROP TABLE ##TempExportData
DROP TABLE ##TempExportData2
SET @columnNames =' '
SET @columnConvert =' '
SET @tempSQL =' '
SELECT 1 as ReturnValue
END













