设为首页 收藏本站
查看: 787|回复: 0

[经验分享] 在SQL Server中查询Excel数据(sp_OpenExcel)

[复制链接]

尚未签到

发表于 2015-6-28 13:57:54 | 显示全部楼层 |阅读模式
  开始:
  在工作中经常要把Excel的数据转换成SQL导入脚本,这里写了一个存储过程sp_OpenExcel,实现查询Excel文件并生成Insert脚本。
  sp_OpenExcel:


DSC0000.gif DSC0001.gif View Code


Use master
Go
if object_ID('[sp_OpenExcel]') is not null
Drop Procedure [sp_OpenExcel]
Go
Create Proc sp_OpenExcel
(
@ExcelFile nvarchar(1024),
@Sheet nvarchar(512),
@Cols nvarchar(1024)=Null,
@Where nvarchar(1024)=Null,
@InsertTable nvarchar(512)=Null,
@IsCreateScript bit=0
)
As
Set Nocount On
Declare @sql nvarchar(4000)
If Isnull(@Sheet,'')=''
Set @Sheet='Sheet1'
If Isnull(@Cols,'')=''
Set @Cols='*'
If Isnull(@Where,'')=''
Set @Where=''
Else
Set @Where='Where '+@Where
Set @sql='Use Test '+Char(13)+Char(10)
If Isnull(@InsertTable,'')''
Set @sql=@sql+'If object_id('+Quotename(@InsertTable,'''')+') Is Not Null Drop Table '+Quotename(@InsertTable)+Char(13)+Char(10)
Set @sql=@sql+'Set Nocount Off '+Char(13)+Char(10)
If @IsCreateScript =1
Set @sql=@sql+'Set Nocount On '+Char(13)+Char(10)

Set @sql=@sql+'Select '+@Cols+Char(13)+Char(10)

If Isnull(@InsertTable,'')''
Set @sql=@sql+'Into '+@InsertTable+Char(13)+Char(10)
-- Office 2007 & 2010
Set @sql=@sql+'    From Openrowset(''Microsoft.ACE.OLEDB.12.0'',''EXCEL 12.0;HDR=YES;IMEX=1; DATABASE='+@ExcelFile+''',['+@Sheet+'$])a '+Char(13)+Char(10)+@Where+Char(13)+Char(10)
-- Office 97-2003
--Set @sql=@sql+'    From Openrowset(''Provider=Microsoft.Jet.OLEDB.4.0'',''EXCEL 8.0;HDR=YES;IMEX=1; DATABASE='+@ExcelFile+''',['+@Sheet+'$])a '+Char(13)+Char(10)+@Where+Char(13)+Char(10)

Set @sql=@sql+'Set Nocount On '+Char(13)+Char(10)
If Isnull(@IsCreateScript,0)=1
Set @sql=@sql+'Exec sp_insertsql '+Quotename(@InsertTable)+Char(13)+Char(10)
If Isnull(@InsertTable,'')'' And @IsCreateScript=1
Set @sql=@sql+'Drop Table '+Quotename(@InsertTable)+Char(13)+Char(10)
Exec(@sql)
Go
  存储过程sp_OpenExcel中生成Insert脚本是借助另外一个存储过程sp_InsertSQL来实现:
  sp_InsertSQL:


View Code


Use master
Go
if object_ID('[sp_InsertSQL]') is not null
Drop Procedure [sp_InsertSQL]
Go
/*生成Insert语句V2.1 Andy 2012-12-7
V2.1 修改了smalldatetime & datetime类型的处理
在V1.0版本的基础上纠正了插入数据感觉慢的问题。
*/
Create Proc sp_InsertSQL
(
@object1    sysname,
@object2    sysname=null
)
As
/*
@object1 源表名
@object2 目标表名
*/
Set Nocount On
Declare @SqlInsert    nvarchar(4000),
@SqlSelect    nvarchar(4000),
@SqlPrint    nvarchar(4000),
@Enter        nvarchar(2),
@Rows        int,
@i            int,
@PrintMaxRows int
If object_id(@object1) Is Null
Begin
Raiserror 50001 N'无效的表名!'
Return
End
If Isnull(@object2,'')=''
Set @object2='#'+@object1
If object_id('tempdb..#Sql') Is Not Null
Drop Table #Sql

Set @Enter=Char(13)+Char(10)
Select    @SqlInsert=Isnull(@SqlInsert+',','Insert Into '+@object2+' (')+Quotename(Name),
@SqlSelect=Isnull(@SqlSelect+'+'',''',' Select ')+'+'+
Case
When xtype In(34,48,52,56,59,60,62,104,106,108,122,127,165,173,189) Then 'Isnull(Rtrim('+Quotename(name)+'),''Null'')'+@Enter
When xtype =58 Then 'Isnull(''''''''+Convert(nchar(16),'+Quotename(name)+',121)+'''''''',''Null'')'+@Enter --smalldatetime
When xtype =61 Then 'Isnull(''''''''+Convert(nchar(23),'+Quotename(name)+',121)+'''''''',''Null'')'+@Enter --datetime
When xtype In(35,36,167,175,241) Then 'Isnull(''N''''''+Rtrim('+Quotename(name)+')+'''''''',''Null'')'+@Enter
When xtype In(98,99,231,239,231)Then 'Isnull(''N''''''+Rtrim(Replace('+Quotename(name)+','''''''',''''''''''''))+'''''''',''Null'')'+@Enter
End
From syscolumns
Where id=object_id(@object1)
Order By colid
Set @SqlInsert=@SqlInsert+')'
Create Table #Sql(ID int Identity(1,1) Primary Key,Sql nvarchar(4000))

Insert Into #Sql
Exec (@SqlSelect+' As Sql From '+@object1)
Set @Rows=@@Rowcount
If Exists(Select 1 From syscolumns Where id=object_id(@object1) And Colstat=1)
Print 'Set Identity_Insert '+Quotename(@object2) +' On'
Print N'Begin Try'+@Enter+Char(9)+'Begin Tran'+@Enter+Char(9)+@SqlInsert
Set @i=0
Set @PrintMaxRows=50
While @i0
Begin
Print (Char(9)+@SqlInsert)
End
If @i%@PrintMaxRows @PrintMaxRows-1 And @i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81185-1-1.html 上篇帖子: SQL Server 事务语法 下篇帖子: SQL Server数据库服务器高性能设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表