2010-11-09 72 views
2

首先是原始问题:可以从一个远程执行t-sql内的查询吗?

假设有2个DB:DB1和DB2。我是否可以连接到DB1,在DB2上执行查询,就像我登录到DB2一样? 所以基本上:

  • 我连接到DB1
  • 从内TSQL我莫名其妙地连接到DB2
  • 我在本地执行的查询(等待)
  • 我关闭连接和我回DB1
  • ,我做了查询的其余部分。

因此我知道我可以做interDB查询,如:select * from DB2.somedb.dbo.sometable,但这不是我所追求的。

背景:

是有数据坐在2台独立的数据库机器。我必须以这样的方式查询数据,以便合并来自两台机器上的表的数据。

我已经试过的场景很多的,每次它要么运行速度很慢,或查询无法做到,由于XML列存在于一个表或其他。

它不工作(虽然手动)的解决方案是:

  • 登录到DB2并做查询的一半到一些临时表
  • 在复制不是Temptable到DB1
  • 登录到DB1并执行查询的第二部分。

perferably我要让这一切一个脚本,这样我就可以自动执行它

回答

3

你是否看了OPENQUERY功能在SQL Server:

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联机丛书更详细,或尝试过你的GOOGL EFU

+0

不知道这是否会与原生的XML列一起工作,您可能需要使用一个视图来覆盖有趣的数据从表格转换为本地列。 – Guy 2010-11-09 11:07:40

+0

此外,与链接的SQL Server,你可以发出像这样的查询:SELECT * FROM SERVER1.database.dbo.tablename INNER JOIN SERVER2.database.dbo.tablename ON ...等等等等 – 2010-11-09 11:20:21

+0

似乎正是我所需要的! – Toad 2010-11-09 11:37:24

1

首先,您必须将两个SQL服务器(SQL1和SQL2)链接。您需要在SQL1上创建一个朝向SQL2的链接服务器,并在远程数据库上拥有适当的权限。关于MSDN的更多信息 - How to create a link server

创建链接服务器后,您应该既可以使用链接服务器功能,也可以使用openquery功能。

使用直接链接服务器(通过执行从SQL1网络指定的传递查询到SQL2-多个I/O)

select * from [LINKED_SERVER_SQL2].[DATABASE_NAME].dbo.[TABLE_NAME] 

使用OPENQUERY执行该查询从SQL1执行查询(执行给定的链接服务器上指定的传递查询 - 免得I/O)

select * from openquery (LINKED_SERVER_SQL2, 'select * from [DATABASE_NAME].dbo.[TABLE_NAME]') 

此外,答案为XML列的特殊性能被发现在this pos吨,我写了几天前的博客关于我发现相同的问题

+0

有关如何处理XML列的有用信息。谢谢。 – Guy 2010-11-10 09:47:31

+0

不客气! – yrushka 2010-11-10 09:52:30

相关问题