我遇到了一个我无法找到任何理由或解决方案的问题。
我正在运行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
包含与列标题一起的数据
答案 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'
以使查询更具可读性。