在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区中的数据进行转换,最后把经过处理的干净的数据加载到数据仓库中。
目标数据库是sql server,现在要从同为sql server的数据源,抽取数据。
步骤如下:
1、开启即席查询
--修改高级参数
sp_configure 'show advanced options',1
go
--允许即席分布式查询
sp_configure 'Ad Hoc Distributed Queries',1
go
--如果配置的值不在合理范围(在最小值最大值范围内),那么可以强制覆盖
reconfigure with override
go
在分布式即席查询中,select into语句不能用于把本地的表导出到远程服务器,解决办法是
要在远程服务器新建表,必须通过execute at来执行DDL语句,
而要执行execute at,必须先设置链接服务器的rpc、rpc out属性为true,最后用insert into把本地的数据导入到远程。
2、创建链接服务器
--建立链接服务器,通过@datasrc指定数据源,适合链接其他多种数据库
EXEC master.dbo.sp_addlinkedserver @server = N'Link',
@srvproduct='ms',
@provider=N'SQLNCLI',
@datasrc=N'192.168.1.5,1433'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'Link',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'sa',
@rmtpassword='xyz'
--建立链接服务器,通过@server参数指定服务器,适合直接连接sql server
EXEC master.dbo.sp_addlinkedserver @server = N'192.168.1.5,1433',
@srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'192.168.1.5,1433',
@useself=N'False',
@locallogin=NULL,
@rmtuser=N'sa',
@rmtpassword='xyz'
3、设置链接服务器的属性,从而远程调用存储过程rpc
EXEC master.dbo.sp_serveroption @server=N'192.168.1.5,1433',
@optname=N'rpc out',
@optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'192.168.1.5,1433',
@optname=N'rpc',
@optvalue=N'true'
4、通过链接服务器来执行分布式查询
select * from link.wc.dbo.wcc
select * from [192.168.1.5,1433].wc.dbo.wcc
5、通过openquery来执行分布式查询,需要先建立链接服务器
select *
from openquery([link],'select * from wc.dbo.wcc')
6、查看链接服务器
select server_id,
name,
product,
provider,
data_source,
is_linked,
is_remote_login_enabled,
is_remote_proc_transaction_promotion_enabled,
lazy_schema_validation
from sys.servers
查看链接登录名
select s.name,
ll.remote_name,
sp.name
from sys.linked_logins ll
inner join sys.servers s
on s.server_id = ll.server_id
left join sys.server_principals sp
on sp.principal_id = ll.local_principal_id
7、删除链接服务器登录名映射、删除链接服务器
exec sp_droplinkedsrvlogin @rmtsrvname = '192.168.1.5,1433',
@locallogin = null
exec sp_dropserver @server = '192.168.1.5,1433'
exec sp_droplinkedsrvlogin @rmtsrvname = 'link',
@locallogin = null
exec sp_dropserver @server = 'link'
8、通过openrowset函数
--第一种写法
SELECT *
FROM
OPENROWSET('SQLOLEDB',
'server=192.168.1.5,1433;uid=sa;pwd=xyz', --字符串
wc.dbo.wcc) --直接写表的名称
--第二种写法
SELECT *
FROM
OPENROWSET('SQLOLEDB',
'server=192.168.1.5,1433;
uid=sa;
pwd=xyz', --字符串
'select * from wc.dbo.wcc
where wcc_name =''abc''') --查询语句,注意不能用字符串连接符
9、通过opendatasource函数
select *
from
opendatasource('SQLOLEDB',
'DATA SOURCE=192.168.1.5,1433;
USER ID=sa;
password=xyz').wc.dbo.wcc