1.导入Excel进数据库,以及导出Excel
本人使用的是 sqlserver2008R2,sqlserver 2005以上版本应该都支持
--先调用sp_configure配置 -----打开 exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure go --关闭 exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigure exec sp_configure 'show advanced options',0 reconfigure go
--调用sp_configure配置 EXEC sp_configure 'show advanced options', 1 GO --调用sp_configure配置 EXEC sp_configure 'show advanced options', 1 GO --更新配置信息 RECONFIGURE GO EXEC sp_configure 'xp_cmdshell', 1 GO RECONFIGURE GO exec sp_configure 'Ole Automation Procedures',0 reconfigure
--系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
--------------------下面是正式代码,经过测试----------------------------------------------------------
导出Excel
exec master..xp_cmdshell 'bcp " select * from SongDB..AppTB" queryout d:\af.xls -c -U "sa" -P "sa"'
--如果接受数据导入的表已经存在
insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
--如果导入数据并生成表
select * into 表 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
注意:导入 Excel版本的问题
--导入 97-2003格式 *.xls
insert into QQFindGreen select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=2;DATABASE=D:\qqfindgreen.xls',[Sheet1$])
--导入2007以上格式 *.xlsx
insert into TableDownload select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;DATABASE=D:\QQ上剩下的表单.xlsx',sheet1$)
--注明: HDR=YES 这个会把Excel的 第一行当做表头子来使用,如果你想导入纯数据,请将 HDR=YES改为HDR=NO
--2、在SQL SERVER里往Excel插入数据:
-- ======================================================
--T-SQL代码:
INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Sheet1$] (bestand, produkt) VALUES (20, 'Test')
导出Excel
exec master..xp_cmdshell 'bcp " select top(10) Sid,SongName,Singer from SongDB..SongTB" queryout d:\ah.xls -c -U "sa" -P "sa"'
--Excel里面数据的更新
update OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=d:\songModel.xls;','select * from [download$]') set NoName1='2000' where 批次 not in(select top(10) 批次 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=2;DATABASE=d:\songModel.xls',[download$]))
--------------------------------------------------------------------------------------------------------------------------------------------
--结论:sql 对于Excel 不支持删除操作
delete from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=d:\songModel.xls',download$) where 批次='2'
/*
链接服务器"(null)"的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 返回了消息 "该 ISAM 不支持在链接表中删除数据。"。
消息 7345,级别 16,状态 1,第 1 行
链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 无法从表 "download$" 删除数据。出现可恢复的、特定于提供程序的错误,如 RPC 失败。
另外特别说明一点:sql语句可以更新Excel表里面的内容,但是 不能删除里面的东西,这个是因为要考虑Excel的安全性
如果要操作删除Excel里面的行,例如删除表头子,可以使用C#代码来删除
纯sql语句完成不了这一功能,要是你们有sql语句可以直接删除Excel表结构的,请指教我,谢谢.
/*分割线********************************************************************************************************/
3.使用 Link Server
使用linq server,你可以访问别的数据库,比如说,你又两个以上的数据库,但是你程序(C#里面的 配置文件connectionString)配置的字符串,肯定不会随意改变
两个数据库,就有连个字符串,也不方便随意切换来,切换去,甚至在 sqlserver里面查数据的时候,如果两个表的数据是有关联的
这时候,使用linq server,让你省去了不少麻烦
--开启 Link Server
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','127.0.0.1' exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa' go
--关闭link server
exec sp_dropserver 'srv_lnk','droplogins' go select distinct A.Sid,A.SongName,A.Singer from AllOORest A,srv_lnk.SongDB.dbo.AlbumSong B
4.得到表的所有信息
--得到表的列的所有信息
select c.name as [字段名],t.name as [字段类型] ,convert(bit,c.IsNullable) as [可否为空] ,convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in ( select name from sysindexes where indid in( select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) as [是否主键] ,convert(bit,COLUMNPROPERTY(c.id,c.name,'IsIdentity')) as [自动增长] ,c.Length as [占用字节] ,COLUMNPROPERTY(c.id,c.name,'PRECISION') as [长度] ,isnull(COLUMNPROPERTY(c.id,c.name,'Scale'),0) as [小数位数] ,ISNULL(CM.text,'') as [默认值] ,isnull(ETP.value,'') AS [字段描述] --,ROW_NUMBER() OVER (ORDER BY C.name) AS [Row] from syscolumns c inner join systypes t on c.xusertype = t.xusertype left join sys.extended_properties ETP on ETP.major_id = c.id and ETP.minor_id = c.colid and ETP.name ='MS_Description' left join syscomments CM on c.cdefault=CM.id where c.id = object_id('DownloadTB')
5.有时候,使用 % _,通配符进行查找数据的时候,可能不是很方便
我们想使用 C#里面的 contains()函数这样的功能
解决方法是建立全文本索引,我从网上找来的方法,原处已经忘记了,感谢那位网友的热情分享
use SongDB --打开数据库 go --检查pubs是否支持全文索引,如果不支持全文索引,则使用sp_fulltext_datebase打开该功能 if (select databaseproperty ('SongDB','IsFulltextEnables'))=0 execute sp_fulltext_database 'enable' --建立全文目录FT_pubs execute sp_fulltext_catalog 'FT_pubs','create' --为titles表建立全文索引数据元 execute sp_fulltext_table 'app','FT_pubs','PK_app' --设置全文索引列名 execute sp_fulltext_column 'app','sid','add' --建立全文索引 execute sp_fulltext_table 'FT_pubs','activate' --填充全文索引目录 execute sp_fulltext_catalog 'FT_pubs','start_full' GO
------------------------------------------------------------------------------------
GO --检查全文目录填充情况 WHILE FulltextCatalogProperty('FT_pubs','PopulateStatus')<>0 BEGIN --如果全文目录正处于填充状态,则等待30秒后再检测一次 WAITFOR DELAY '0:0:30' END
--------------------------------------------------------------------------------------
6.我想还有一些功能,是很多人想用的,比如导入xml数据
从本质上来讲 xml数据是比Excel数据要友好一点,因为 xml数据,你可以使用
linq to xml,以及 使用文件读写xml的方式来访问,但是为了不用那么麻烦
自己去解析 xml,然后拼接sql语句来进行insert into,本人一度曾经这么做过
因为在网上没发现什么 能够直接拿来用的.
我的数据都是从百万级数据库上 导出的xml数据,都是几十兆大小到几百兆大小不等
如果直接 放在sql语句里面当做xml变量,我试过,打开文件不是一般的长...
最好的办法是,只要知道它的结构,以及xml文件所存放在磁盘上的物理路径就好了
实现的方法如下
首先要自己创建一个表名
CREATE TABLE tb_OldTB( 歌曲名称 nvarchar(200), 表演者 nvarchar(200), 歌曲类别 nvarchar(50), 歌手类别 nvarchar(50), 音源存放路径 nvarchar(120) ) go
然后是 导入xml文件
DECLARE @h int, @doc xml SELECT @doc=BulkColumn FROM OPENROWSET (BULK 'I:\NewExcel\514273.xml', SINGLE_BLOB) AS xmlData EXECUTE sp_xml_preparedocument @h OUTPUT, @doc insert into tb_OldTB select * from OPENXML(@h, '/data/row',2) WITH tb_OldTB EXECUTE sp_xml_removedocument @h go
--需要修改的地方有两处 ,
其一是 BULK 'd:\NewExcel\514273.xml' 这里放的是 xml文件在电脑上的物理路径
其二是 :'/data/row' 这是xml里面的结构,比如根节点是 data, 下面的子节点 是 row,row里面放置的就是一条一条的记录
--导入完毕以后会显示 导入的结果
--查询前10条
select top(10)* from tb_OldTB
本人感觉挺傻的,就是导入xml不像导入 Excel那样会给你自动创建表,而要你自己亲自动手创建表,尽管有些牛人 也用sql自己写函数实现了这一功能
本人后来想想,创建一张表,要多少时间,而且 字段的定义,长短多少都可以做到心中有数,表结构是相当重要的!!!这一点请一定要牢记
另外是 说一下 虽然导入Excel,可以让它自动帮我们建好字段,可是系统也是相当的傻,字段的类型 居然都是 varchar,而且长度都是 255 !!!
对于 自增列Id,的处理不方便,要自己动手改,对于 长于255的备注信息,文章信息 都会被截断!!! 这实在.... 所以为了...最好还是自己建好表结构
然后再往表里面插入数据
尽量少使用 insert into 新表 select * from ....
恩,有其他的导入的,可以 发来跟我一起分享一下,
比如 导入的数据是 .txt的文本文件 等等