当前位置: 代码迷 >> Sql Server >> sql数据循环写入excel中遇到的有关问题
  详细解决方案

sql数据循环写入excel中遇到的有关问题

热度:195   发布时间:2016-04-24 08:44:53.0
sql数据循环写入excel中遇到的问题
数据格式类似这样的
姓名 时间 分数
张三 一年级 70
张三 二年级 70
张三 五年级 56
张三 四年级 90
张三 三年级 89
张三 六年级 89
李四 三年级 32
李四 四年级 55
李四 五年级 64
李四 六年级 63
王五 三年级 77
王五 二年级 89
王五 六年级 88
赵六 五年级 64

目标是想变成:
张三.xls  李四.xls;王五.xls;赵六.xls。表格式与张三哪个一样;即按时间排序
姓名 时间 分数
张三 一年级 70
张三 二年级 70
张三 三年级 56
张三 四年级 90
张三 五年级 89
张三 六年级 89

我写了一段代码,但是得不到想要的结果
USE BACKDATABASE
SELECT * INTO #SortINFO FROM BACKDATABASE
ORDER BY 姓名,分数
SELECT DISTINCT 姓名 INTO #SortINFO FROM BACKDATABASE
SELECT ROW_NUMBER() OVER(ORDER BY 姓名) AS rowid, 姓名 INTO #SingalID1 FROM #SingalID
--SELECT * FROM #SingalID1
DECLARE @maxROW INT,@i INT
SET @i=1
SELECT @maxROW = COUNT(*) FROM #SingalID1
DECLARE @adff NVARCHAR(30)
EXEC sp_configure 'show advanced options',1 
RECONFIGURE 
EXEC sp_configure 'Ad Hoc Distributed Queries',1 
RECONFIGURE
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
WHILE @i<@maxROW
BEGIN
SELECT @adff=姓名 from #SingalBusID1 where rowid=@i
EXEC master..xp_cmdshell 'bcp "SELECT * FROM #SortINFO a WHERE a.姓名= '+cast(@adff,VARCHAR(30)+'" queryout "C:\Users\hp\Desktop\'+cast(@adff as VARCHAR(30))+'.xls" -c -S"NEVC-I70261-T" -U"sa" -P"sa123"'
SET @i=@i+1
END
DROP TABLE #SortBUSINFO
DROP TABLE #SingalBusID
DROP TABLE #SingalBusID1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 0
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 0
EXEC sp_configure 'Ad Hoc Distributed Queries',0 
RECONFIGURE
EXEC sp_configure 'show advanced options',0
RECONFIGURE
数据只是个例子,想通过语言来实现。真实数据量很大,不方便通过向导一步一步导出,谢谢
------解决思路----------------------
把临时表#SortINFO换成实体表试试
------解决思路----------------------
引用:
Quote: 引用:

临时表 #SortINFO 不在同一个批处理中,xp_cmdshell 执行的是系统命令行的命令。只能换成实体表了

嗯,确实是这个问题。但是现在又有新问题了.....
列名无效?


你把 EXEC master..xp_cmdshell 改为 print 输出看看,语法是否错误
------解决思路----------------------
为什么要这样写,不能直接用游标吗

USE test
GO
DECLARE @name varchar(50)
DECLARE @sql varchar(8000) 
DECLARE cur CURSOR FOR SELECT DISTINCT [姓名] FROM A ORDER BY [姓名]
OPEN cur
FETCH NEXT FROM cur INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql='bcp "select t.[姓名],t.[时间],t.[分数] from (select *,case left([时间],1) when ''一'' then 1 when ''二'' then 2 when ''三'' then 3 when ''四'' then 4 when ''五'' then 5 when ''六'' then 6 end as stime from test.dbo.A where [姓名]='''+@name+''') t order by t.stime" queryout "c:\'+@name+'.xls" -c -U"sa" -P"123456"'
EXEC master..xp_cmdshell @sql
FETCH NEXT FROM cur INTO @name
END
CLOSE cur
DEALLOCATE cur
GO
  相关解决方案