首先是原始问题:
鉴于有2个DB:DB1和DB2。我是否可以连接到DB1,在DB2上执行查询,就好像我已登录到DB2一样? 所以基本上:
所以我知道我可以执行interDB查询,例如:select * from DB2.somedb.dbo.sometable但这不是我想要的。
背景:
是否有数据位于2台独立的数据库计算机上。我必须以这样的方式查询数据,以便组合两台机器上的表的数据。
我已经尝试了很多场景,并且每次运行速度非常慢,或者由于XML列存在于一个表或另一个表中而无法进行查询。
有效的解决方案(尽管是手动的)是:
最好我想制作这一个脚本所以我可以自动化它
答案 0 :(得分:3)
您是否查看了SQL Server中的OPENQUERY
函数:
EXEC sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
GO
甚至是OPENROWSET
函数:
SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks.HumanResources.Department
ORDER BY GroupName, Name') AS a;
在线使用SQL Server书籍以获取更多详细信息,或试用 googlefu
答案 1 :(得分:1)
首先,您必须链接两个SQL Server(SQL1和SQL2)。您需要在SQL1上为SQL2创建一个链接服务器,并使用对远程数据库具有适当权限的有效登录。关于MSDN的更多信息 - How to create a link server
创建链接服务器后,您应该既可以使用链接服务器功能,也可以使用openquery功能。
使用直接链接服务器从SQL1执行的查询(通过网络从SQL1执行指定的传递查询到SQL2-更多I / O)
select * from [LINKED_SERVER_SQL2].[DATABASE_NAME].dbo.[TABLE_NAME]
使用Openquery执行的查询(在给定的链接服务器上执行指定的传递查询 - 以免I / O)
select * from openquery (LINKED_SERVER_SQL2, 'select * from [DATABASE_NAME].dbo.[TABLE_NAME]')
此外,xml列的特殊性的答案可以在this pos t找到,我几天前写了一篇关于我发现的同样问题的博客