--背景
有时,需要用bcp命令将排序后的查询结果生成一个excel附件,放在本地。
这时,需要将字段名和排序后的查询结果一起放在本地。
--试验步骤:
SELECT '平均消耗CPU 时间(ms)'
UNION ALLorder by avg_elasped_time desc
执行报错:
消息 207,级别 16,状态 1,第 5 行
Invalid column name 'avg_elasped_time'.
消息 104,级别 16,状态 1,第 5 行
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.
--在第一个SELECT 字段名后加 ’AS avg_elasped_time‘可以了。
SELECT '平均消耗CPU 时间(ms)' AS avg_elasped_time
UNION ALL
SELECT CAST( avg_elasped_time AS NVARCHAR(100))
FROM dba.dbo.bdd_temp_find_top_select_cpu
order by avg_elasped_time desc
--查询结果如下
但是发现,一个问题:
14701前面的都按降序排列了,但是14701是最大的,却排在了后面。
--改正(将行号和该字段值拼接,然后取除最后一位数的前几位):
SELECT '平均消耗CPU 时间(ms)' AS avg_elasped_time
UNION ALL
SELECT SUBSTRING(CAST( avg_elasped_time AS NVARCHAR(100)) +CAST(ROW_NUMBER() OVER (ORDER BY avg_elasped_time DESC) AS NVARCHAR(100)),1,LEN(avg_elasped_time))
FROM dba.dbo.bdd_temp_find_top_select_cpu
--结果如下:
--可以通过以下语句,验证上面数值的是否正确
SELECT CAST( avg_elasped_time AS NVARCHAR(100)) ,
CAST(ROW_NUMBER() OVER (ORDER BY avg_elasped_time DESC) AS NVARCHAR(100)),
CAST( avg_elasped_time AS NVARCHAR(100)) +CAST(ROW_NUMBER() OVER (ORDER BY avg_elasped_time DESC) AS NVARCHAR(100)),
SUBSTRING(CAST( avg_elasped_time AS NVARCHAR(100)) +CAST(ROW_NUMBER() OVER (ORDER BY avg_elasped_time DESC) AS NVARCHAR(100)),1,LEN(avg_elasped_time))
FROM dba.dbo.bdd_temp_find_top_select_cpu
--结果