类型:办公软件大小:69KB语言:中文评分:2.8标签:立即下载有人提问如下:
这个是超过的,比如是test.xls欠费年份欠费开始月份欠费结束月份应缴金额(月租) 2001 9 12 94.4 2008 5 12 88.8 2010 8 12 90.4___________________________________________这个是表:比如是a表a(pk,int,不为null) //主键,自动增长b(varchar(19),null) //费款所属期(c)十进制(10,2),空)//应缴金额___________________________________________现在我要将test.xls中的数据导入到a表,从开始月份到结束月份要做循环导入,比如第一条2001年的从9月到12月要录入四条数据到a表,导入后的格式如:从C1 2001-09 94.42 2001-10 94.43 2001-11 94.44 2001-12 94.4中选择*数据库是:MS Sql server 2008
解析:
思路一:可以使用局域网数据查询导入到表变量中,再用游标循环赋值。方法如下:
使用testdb 2go/* * * * * * * * * * * * * * * * * * * * *建立测试数据* * * * * * * * * * * * * * * *如果不是OBJECT _ ID('[TBTest]')就是null drop TABLE[TBTest]GOCREATE TABLE[TBTest]([tid]int identity(1,1)主键,[日期] NVARCHAR(20) null,[货币]十进制(10,2)null)go/* * * * * * * * * * * * * * * * * * * * *启用临时分布式查询* * * * * * * * * * * * * * * * * * * * * * * * * * * */-使用主- go - sp_configure "显示高级选项“,1 - GO -重新配置-启用分布式查询即席分布式查询- sp_configure '即席分布式查询,1 - GO -重新配置-gouse testdb 2 go/* * * * * * * * * * * * * * *定义表变量* * * * * * * * * * * * * * * * *声明@ TableVar表(PKId int主键标识(1,1),RYear int不为空,b月整数不为空,EMonth int不为空,RMoney十进制(15,2)不为空,d1日期为空,d2日期为空)插入@TableVar(RYear,BMonth,EMonth,RMoney)从OpenRowSet('微软. 喷气机。OLEDB.4.0 ',' Excel 8.0HDR=是;IMEX=1;数据库=d : test test 20110501。xls ','从[Sheet1$]'中选择*)/* * * * * * * * * * * * * * * * * * *第一种方法,用游标* * * * * * * * * * * * * * * * * * * * * DECLARE @ ryaar int DECLARE @ BMonth int DECLARE @ EMonth int DECLARE @ RMoney int DECLARE date demo _ CURSOR用于从@TableVar中选择ryaar、b month、EMonth、RMoney其中1=1打开日期演示蚀刻NEXT FROM date demo _ CURSOR to @ ryaar、@BMonth、@ EMonth、@ RMoneyWHILE @ FETCH _ STATUS=0 begin-print @ ryaar-print @ b month-print @ EMonth-print @ RMoney-修改记录当(@ EMonth-@ b月=0)开始插入[TBTest]SELECT TOP 1强制转换(RYear AS nvarchar(4))'-' CASE WHEN(@ b月10)然后' 0 '强制转换(@ b月AS nvarchar(2))ELSE强制转换(@ b月AS nvarchar(2))END,Rmoney来自@TableVar其中RYear=@ RYearSET @月=@ b月1日END-修改结束将下一个开始日期演示光标提取到@RYear 、@BMonth 、@EMonth 、@ rmoneendclose date Demo _ curs perspect定位日期演示光标选择*来自[测试]
查询结果:
/*tid日期货币1 2001-09 94.402 2001-10 94.403 2001-11 94.404 2001-12 94.405 2008-05 88.806 2008-06 88.807 2008-07 88.808 2008-08 88.809 2008-09 88.8010 2020
评价:该方法使用了最传统的方法,思路清晰。但没有体现SQL server 2008的语法特性,略显繁琐。
思路二:可否使用贸易与环境委员会实现?(杀提供)
/*
******************第二种方法,用CTE,适用于SQL 2005/2008/2008 R2 * * * * * * * * * * */TRUNCATE table[TBTest]goDeclare @ TableVar table(Pkid int主键标识(1,1),RYear int不为null,b月整数不为null,EMonth int不为空,十进制(15,2)不为null);插入到@TableVar(RYear,BMonth,EMonth,RMoney)中从OpenRowSet('微软)中选择*。喷气机。OLEDB.4.0 ',' Excel 8.0HDR=是;IMEX=1;数据库=d : test test 20110501。xls ','从[Sheet1$]'中选择*);seq as(从sys.objects中选择前12个row_number()超过(按对象id排序)val)选择“铸造(t . ryar AS nvarchar(4)”-“案例当(t . b第一个序列val10)然后0 ' cast(t . b第一个序列。val AS nvarchar(2))ELSE(t . b第一个seq.val AS nvarchar(2)) END,RMoney cfrom @TableVar t内部联接序列on t第一个seq.val=
EMonth
思路三:可否使用SQL Server 2008新提供的合并实现?
思路四:使用北太平洋涛动指数在业务层实现数据转换。
思路五:用掌握.spt _值表实现(由小F提供)
利用该表,可获取一定区间内的列表,最长不超过2048,如
从主菜单中选择号码.spt _ valueswhere此处此处键入='P '和一到5之间的数字/*number12345*/
因为月份最多12,不超过2048,因此可以利用掌握.spt_values。
/*******************第五种方法,用掌握.spt_values,适用于SQL 2005/2008/2008 R2 * * * * * * * * * */* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *声明@ TableVar表(PKId int主键标识(1,1),RYear int不为null,b月整数不为null,EMonth int不为空,十进制(15,2)不为null,d1日期为空,d2日期为null);插入到@TableVar(RYear,BMonth,EMonth,RMoney)中从OpenRowSet('微软)中选择*。喷气机。OLEDB.4.0 ',' Excel 8.0HDR=是;IMEX=1;数据库=d : test test 20110501。xls ','从[Sheet1$]'中选择*);selecttid=row_number()over(按getdate()排序),ltrim(RYear) '-' ltrim(右侧(100个数字,2))作为日期,b.RMoney作为moneyfrommaster.spt_values a,@ TableVar和EMonthandtype之间的数字='p '
思路六:使用成服务实现