【问题标题】:Joining tables from different servers连接来自不同服务器的表
【发布时间】:2012-02-03 20:47:21
【问题描述】:

关于如何在存储过程中连接来自不同服务器的表有什么建议吗?

【问题讨论】:

    标签: sql-server sql-server-2000


    【解决方案1】:

    没有更多细节,很难给出直接的例子,但这里是基本的想法:

    首先,在存储过程之外,主机服务器(存储过程所在的服务器)必须知道第二个服务器,包括(可能)登录信息。

    在您的主服务器上,运行sp_addlinkedserver 存储过程。只需执行一次:

    exec sp_addlinkedserver @server='(your second server)';
    

    如果您需要向第二台服务器提供登录信息(例如,该进程无法使用初始数据库连接中使用的相同凭据登录),请使用sp_addlinkedsrvlogin存储过程:

    exec sp_addlinkedsrvlogin @rmtsrvname='(your second server)',
    @useself=false, 
    @rmtuser='yourusername', 
    @rmtpassword='yourpassword';
    

    然后,在您的存储过程中,您可以在第二台服务器上指定表:

    SELECT table1.*
    FROM table1
    INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
        table1.joinfield = table2.joinfield
    

    【讨论】:

      【解决方案2】:

      1.检查您是否有任何使用exec sp_helpserver的链接服务器

      2. 如果您的服务器没有返回,那么它不是Linked,这意味着您需要添加它。 否则转到第 3 步。

      对于Sql Server 2008 R2,请转至Server Object > Linked Servers > Add new Linked Server

      或者

      exec sp_addlinkedserver @server='ServerName'; 
      

      3. 像这样连接到辅助服务器...

      exec sp_addlinkedsrvlogin 
      @rmtsrvname='ServerName'
      , @useself=false
      , @rmtuser='user'
      , @rmtpassword='Password';
      

      4.现在您可以加入两个不同服务器的表。

      SELECT 
          SRV1.*
      FROM 
          DB1.database_name.dbo.table_name SRV1
              INNER JOIN DB2.database_name.dbo.table_name SRV2
              ON SRV1.columnId = SRV2.columnId
      GO
      

      【讨论】:

        【解决方案3】:

        在加入表格之前,您必须先链接两个服务器。一旦它们被链接,您可以使用下面的查询并替换服务器、数据库和表名。

        记得在 DB2 中执行以下 sql:

        EXEC sp_addlinkedserver DB1
        GO
        
        -- below statement connects sa account of DB2 to DB1
        EXEC sp_addlinkedsrvlogin @rmtsrvname = 'DB1', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'DB1 sa pwd'
        GO
        
        SELECT a.columns 
        FROM DB1.database_name.dbo.table_name a
        INNER JOIN DB2.database_name.dbo.table_name b
        ON a.columnId = b.columnId
        GO
        

        链接服务器 - http://msdn.microsoft.com/en-us/library/ms188279.aspx

        【讨论】:

          【解决方案4】:

          您可以编写如下语法的查询来加入 SQL Server 中的其他服务器

          SELECT table_1.*  
          FROM [Database_1].[dbo].[Table_1] table_1
          INNER JOIN  [IP_OF_SERVER_2].[Database_2].[dbo].[Table_2] table_2 ON table_1.tablekey COLLATE DATABASE_DEFAULT  = table_2.tablekey COLLATE DATABASE_DEFAULT
          

          p/s: COLLATE DATABASE_DEFAULT 进行编码, 防止波纹管错​​误 无法解决 equal to 操作中“Vietnamese_CI_AS”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

          【讨论】:

            猜你喜欢
            • 2012-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-30
            • 1970-01-01
            • 1970-01-01
            • 2014-08-27
            • 2020-09-30
            相关资源
            最近更新 更多