一个Excel导入SQL server 2008的例子

downmoon 2011-05-02 01:11:13
有人提问如下:
这个是Excel的,比如是test.xls
欠费年份 欠费开始月份 欠费结束月份 应缴金额(月租)
2001 9 12 94.4
2008 5 12 88.8
2010 8 12 90.4
___________________________________________

这个是表:比如是a表
a(pk,int,not null) //主键,自动增长
b(varchar(19),null) //费款所属期
c(decimal(10,2),null) //应缴金额___________________________________________

现在我要将test.xls中的数据导入到a表,从开始月份到结束月份要做循环导入,比如第一条2001年的从9月到12月要录入4条数据到a表,导入后的格式如:
select * from a

a b c
1 2001-09 94.4
2 2001-10 94.4
3 2001-11 94.4
4 2001-12 94.4

数据库是:MS Sql server 2008

我已经有解法利用游标实现,如下:
http://blog.csdn.net/downmoon/archive/2011/05/02/6382568.aspx

希望大家分享更好的解法。最好能利用sql server 2008的特性,如cte,merge等。
...全文
217 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qgqch2008 2011-05-02
  • 打赏
  • 举报
回复
cte就是嵌套查詢,使得代碼看起來比較整齊不亂,沒有必要非要用吧。。。
qgqch2008 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 downmoon 的回复:]
二楼果然不愧MVP,学习master..spt_values!
[/Quote]master..spt_values在這裡只不過是用來生成行的副本作用,自己創建一個數字輔助表也一樣,
ps:cte2005也有
downmoon 2011-05-02
  • 打赏
  • 举报
回复
二楼果然不愧MVP,学习master..spt_values!
downmoon 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bin_520_yan 的回复:]

或者用SSIS来导入快
[/Quote]
当然用NPOI也不错。但是导入后都要处理时间区间
downmoon 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fredrickhu 的回复:]

SQL code
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-05-02 03:47:37
-- Verstion:
-- Microsoft SQL Server 2008 (RTM) - 10.0……
[/Quote]
凌晨四点,my god!太感动了
在看凯子对热火么?
DataBox-MDX 2011-05-02
  • 打赏
  • 举报
回复
或者用SSIS来导入快
jeeanc 2011-05-02
  • 打赏
  • 举报
回复
高手云集啊。其实Excel与SQL互相导入应用很广。前一阵子,我还专门下载学习过这方面的知识。
--小F-- 2011-05-02
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-05-02 03:47:37
-- Verstion:
-- Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([欠费年份] int,[欠费开始月份] int,[欠费结束月份] int,[应缴金额] numeric(3,1))
insert [tb]
select 2001,9,12,94.4 union all
select 2008,5,12,88.8 union all
select 2010,8,12,90.4
--------------开始查询--------------------------
select
tid=row_number()over(order by getdate()),ltrim(欠费年份)+'-'+ltrim(right(100+number,2)) as date,b.应缴金额 as money
from
master..spt_values a, tb b
where
number between 欠费开始月份 and 欠费结束月份
and
type='p'
----------------结果----------------------------
/*
(3 行受影响)
tid date money
-------------------- ----------------- ---------------------------------------
1 2001-09 94.4
2 2001-10 94.4
3 2001-11 94.4
4 2001-12 94.4
5 2008-05 88.8
6 2008-06 88.8
7 2008-07 88.8
8 2008-08 88.8
9 2008-09 88.8
10 2008-10 88.8
11 2008-11 88.8
12 2008-12 88.8
13 2010-08 90.4
14 2010-09 90.4
15 2010-10 90.4
16 2010-11 90.4
17 2010-12 90.4

(17 行受影响)


*/
downmoon 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qgqch2008 的回复:]
master..spt_values在這裡只不過是用來生成行的副本作用,自己創建一個數字輔助表也一樣,
[/Quote]
没错!自己创建也要利用系统功能。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧