启用Ad Hoc Distributed Queries
在使用openrowset/opendatasource前搜先要启用Ad Hoc Distributed Queries服务,因为这个服务不安全所以SqlServer默认是关闭的
启用Ad Hoc Distributed Queries的方法
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource'
的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用
sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细
信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。
启用Ad Hoc Distributed Queries的方法,执行下面的查询语句就可以了:
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
使用完毕后,记得一定要要关闭它,因为这是一个安全隐患,切记执行下面的SQL语句
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
导入、导出数据到Excel
一、如我在D盘下有D:物件编码.xls文件,有工作表名Sheet是中文命名为‘办公用品编码’,‘零件编码’。
select * into #temp fromopendatasource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:物件编码.xls')...[办公用品编码$]
select * into #temp fromopendatasource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:物件编码.xls')...[零件编码$]
二、如你的Excel文件是工作表是默认的Sheet命名为Sheet1,Sheet2等。
select * into #temp fromopendatasource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:物件编码.xls')...[Sheet1$]
select * into #temp fromopendatasource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:物件编码.xls')...[Sheet2$]
三、引用 Limpire (昨夜小楼)以下方法,也行
OpenRowSet和OpenDataSource都能用读取用数字命名的Sheet,只不过要加单引号界定,其它不规则命名的Sheet也一样。
假设C:Text.xls有个Sheet名字是“3”:
select*fromopendatasource('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:Test.xls')...['3$']
--OR
select*fromopenrowset('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:Test.xls',['3$'])
--OR
select*fromopenrowset('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:Test.xls','select * from [''3$'']')
--OpenRowSet(,,'query')可以不加单引号界定:
select*fromopenrowset('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:Test.xls','select * from [3$]')
四、导出EXCEL
导出EXCEL时,对应字段数类型都要相同,EXCEL字段的名称stano,sname 和数据库的要一样,才能导出成功。
insert into openrowset('MICROSOFT.JET.OLEDB.4.0','excel 8.0;
HDR=YES;database=D:FName.xls',sheet1$)
select stano,sname from stainfo
以上在SQL SERVER2000上测试均可以运行,是在本地查询分析器中调试。
访问远程数据库(openrowset/opendatasource/openquery)
示例1:
--创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器 exec sp_dropserver 'ITSV ', 'droplogins ' --连接远程/局域网数据(openrowset/openquery/opendatasource) --1、openrowset --查询示例 select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --生成本地表 select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) --把本地表导入远程表 insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) select *from 本地表 --更新本地表 update b set b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' --查询 select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') --把本地表导入远程表 insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') select * from 本地表 --更新本地表 update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a inner join 本地表 b on a.列A=b.列A --3、opendatasource/openrowset SELECT * FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta --把本地表导入远程表 insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 select * from 本地表
示例2:
可以看到SqlServer连接多服务器的方式有3种
其中我个人认为openrowset最好,使用简单而且支持在连接时制定查询语句使用很灵活
openquery也不错查询时也可以指定查询语句使用也很灵活,不过查询前要先用exec sp_addlinkedserver和exec sp_addlinkedsrvlogin建立服务器和服务器连接稍显麻烦
opendatasource稍显欠佳,他无法在连接时指定查询使用起来稍显笨拙
另外还可以连接到远程Analysis服务器做MDX查询,再用T-Sql做嵌套查询,可见T-SQL的远程查询非常强大
转自:
导入、导出Excel:http://www.cnblogs.com/lhuser/articles/1487953.html
访问远程数据库:http://www.cnblogs.com/opencoder/archive/2010/03/18/1689321.html
文章转自:http://www.cnblogs.com/longdexinoy/archive/2012/09/09/2677535.html#undefined