SQLSERVER实现跨库查询

一、同一服务器下的跨库查询
1.完全限定名称法
直接使用 [数据库名].[架构名].[表名]
格式访问其他数据库的表.
SELECT * FROM [目标数据库名].[dbo].[表名];
示例:查询 SQLATM
数据库中的 DeptSales_copy
表。
2.JOIN 操作
跨库表关联时,直接在 SQL 语句中指定完整路径:
SELECT a.*, b.*
FROM [Db1].[dbo].[TableA] a
INNER JOIN [Db2].[dbo].[TableB] b ON a.Id = b.Id;
需确保当前用户对两个库均有访问权限。
二、跨服务器的查询(分布式查询)
方法 1:创建链接服务器
1.添加链接服务器
使用 sp_addlinkedserver
创建远程服务器连接:
EXEC sp_addlinkedserver
@server = 'RemoteServerAlias', -- 链接服务器别名
@srvproduct = '',
@provider = 'SQLOLEDB',
@datasrc = '远程服务器IP或实例名'; -- 服务器地址:ml-citation{ref="1,4" data="citationList"}。
2.配置登录凭据
通过 sp_addlinkedsrvlogin
设置远程登录信息:
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'RemoteServerAlias',
@useself = 'False',
@rmtuser = '用户名',
@rmtpassword = '密码'; :ml-citation{ref="3,4" data="citationList"}。
3.执行跨服务器查询
使用 [链接服务器别名].[数据库名].[架构名].[表名]
格式访问:
SELECT * FROM [RemoteServerAlias].[目标数据库名].[dbo].[表名]; :ml-citation{ref="1,5" data="citationList"}。
方法 2:使用 OPENROWSET/OPENDATASOURCE
1.OPENROWSET 查询
适用于临时查询,需启用 Ad Hoc Distributed Queries
配置:
SELECT * FROM OPENROWSET(
'SQLOLEDB',
'远程服务器IP;用户名;密码',
'SELECT * FROM [目标数据库名].[dbo].[表名]'
); :ml-citation{ref="6,7" data="citationList"}。
2.OPENDATASOURCE 查询
类似 OPENROWSET,但直接在 FROM 子句中使用:
SELECT * FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=远程服务器IP;User ID=用户名;Password=密码'
).[目标数据库名].[dbo].[表名]; :ml-citation{ref="6,7" data="citationList"}。
三、跨数据库系统查询(如 MySQL)
1.配置 ODBC 数据源
安装对应数据库的 ODBC 驱动(如 MySQL ODBC),配置系统 DSN58。
2.创建异构链接服务器
使用 sp_addlinkedserver
并指定非 SQL Server 提供程序:
EXEC sp_addlinkedserver
@server = 'MySQL_Link',
@srvproduct = 'MySQL',
@provider = 'MSDASQL',
@datasrc = 'ODBC数据源名称'; :ml-citation{ref="5,8" data="citationList"}。
3.执行查询
SELECT * FROM [MySQL_Link]...[表名]; -- 注意语法差异:ml-citation{ref="5,8" data="citationList"}。
四、注意事项
- 权限要求
- 跨库查询需当前用户对目标库有
SELECT
权限17。 - 链接服务器需
ALTER ANY LINKED SERVER
权限45。
- 跨库查询需当前用户对目标库有
- 性能优化
- 避免频繁跨服务器 JOIN 大数据量表,建议通过 ETL 同步数据3。
- 跨服务器查询可能因网络延迟影响性能7。
- 删除链接服务器
不再使用时,通过sp_dropserver
清理:
EXEC sp_dropserver 'RemoteServerAlias', 'droplogins'; :ml-citation{ref="3,6" data="citationList"}。