从SQL Server导出到Excel

时间:2015-05-20 02:58:57

标签: sql-server excel export-to-excel

我遇到了一个我无法找到任何理由或解决方案的问题。

我正在运行SQL脚本以将一些数据导出到Excel工作表。另一端运行一个应用程序,用于读取和处理Excel工作表。

问题:列标题显示在底部,应用程序期望它们位于顶行。我无法改变应用程序的功能。

这在SQL 2005中运行良好,但我们最近更新到SQL 2012,这开始发生。

我没有通过互联网找到任何解决此问题的方法。

这是我正在执行的SQL脚本

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(replace(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 + ' -T -w -S' + @serverInstance

EXEC master..xp_cmdshell @bcpCommand

其中TempExportData2包含与列标题一起的数据

1 个答案:

答案 0 :(得分:0)

我认为我理解了这个问题:您使用order by中的select into而不是最终select声明。

你应该知道表中的数据被认为是无序的,并且如果select语句不包含{{1},则Sql Server(以及我知道的任何其他rdbms)实际上并不保证所选行的顺序条款。

因此,您应该将order by列添加到[temp##SortID]表,并使用它来对最后的##TempExportData2语句进行排序:

select

由于输出查询中不需要该列,因此您可能希望在该select语句中指定列名。但是,如果它不会对您的应用程序造成损害,即读取excel文件或它产生的数据,我建议保留SET @bcpCommand = 'bcp " SELECT * from ##TempExportData2 ORDER BY [temp##SortID]" queryout' 以使查询更具可读性。