SQL Server链接服务器错误

时间:2014-01-19 06:24:22

标签: .net sql-server

我想将一些表从sql server 2008(总公司)发送到sql server 2008 express(客户端)。两台服务器位于不同的位置。我的客户端服务器名称是动态的。 我正在执行下面的存储过程:

@BranchServerName= 'ClientServerName\Sqlexpress'

if  exists(select * from sys.servers where name = @BranchServerName)
begin
    EXEC sp_droplinkedsrvlogin @BranchServerName, NULL
             EXEC sp_dropserver @BranchServerName, NULL;
     end
IF NOT EXISTS(select * from sys.servers where name = @BranchServerName)
begin
EXEC sp_addlinkedserver @BranchServerName,N'SQL Server';
EXEC sp_addlinkedsrvlogin @rmtsrvname=@BranchServerName, 
@useself='false',
    @rmtuser='sa',
    @rmtpassword='*******'
end

set  @sqlCmd = 'A big Sql Query'
EXEC sp_executesql @sqlCmd

if  exists(select * from sys.servers where name = @BranchServerName)
begin
    EXEC sp_droplinkedsrvlogin @BranchServerName, NULL
    EXEC sp_dropserver @BranchServerName, NULL;
end

有时候我不会一直收到以下错误:

  1. 拒绝访问远程服务器,因为不存在登录映射

  2. 在sys.servers中找不到服务器'ClientSide \ SQLEXPRESS'。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。

  3. 请帮我解决这个问题。这真的让我发疯了。我查了很多文章,但我无法弄清楚我错在哪里。

    感谢您的帮助。

    第二次编辑:

    使用OpenRowSet进行第二次试验: 我使用了以下编码

    使用OpenRowSet进行第二次试验:

    SELECT * FROM OPENROWSET('SQLNCLI','Server=ClientServer\SQLEXPRESS;Database=ClientDB;Uid=sa;Pwd=*****',
    'SET FMTONLY OFF;SET NOCOUNT ON;  
    INSERT INTO [ClientServer\SQLEXPRESS].ClientDB.dbo.TB_ClientTable
            SELECT  * FROM  TB_ServerTable
              WHERE TransHdrID= 45 and SourceID=3453
           ')
    

    注意:TB_ClientTable名称和TB_ServerTable名称相似。在上面我只插入一个表,但我必须插入6个表。我的ClientServerName是动态的。我使用很长的动态查询。上面是一个应该工作的小样本。但我收到以下错误:

    OLE DB提供程序“SQLNCLI10”用于链接服务器“(null)”返回消息“延迟准备无法完成。”。 Msg 8180,Level 16,State 1,Line 1 声明无法准备。 Msg 7202,Level 11,State 2,Line 2 在sys.servers中找不到服务器'192.168.14.42 \ SQLEXPRESS'。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。

    请指导我或请纠正我。

    第三次编辑:

    第三次编辑

    如何使用Openrowset继续下面的任何想法:

    Declare @ID nvarchar(10)
    set @ID='1234' 
    INSERT INTO OPENROWSET ('SQLNCLI','Server=ClientServer\SQLEXPRESS;Database=ClientDB;Uid=sa;Pwd=*****',
    'IF (EXISTS(SELECT * 
        FROM ClientDB.dbo.ClientTableName TransHdrID
        where ID='+@ID+')) 
     begin
        delete from ClientDB.dbo.ClientTableName where ID='+@ID+'
         (Want to get value from ClientServer)           
         SELECT Field1,Field2
         FROM ClientDB.dbo.ClientTableName
     end 
    else
     begin
               (Want to get value from ClientServer) 
        SELECT Field1,Field2
        FROM ClientDB.dbo.ClientTableName
     end')
        SELECT Field1,Field2
        FROM LocalDB.dbo.LocalTableName
        WHERE ID=@ID 
    

    请帮助我如何实现上述目标。我确定存在语法错误。我没有从谷歌冲浪得到适当的解决方案。还告诉我,我可以使用SSIS进行上述操作。请指导我

1 个答案:

答案 0 :(得分:0)

以下是一个例子:

INSERT INTO OPENROWSET
('SQLNCLI',
'Server=ClientServer\SQLEXPRESS;Database=ClientDB;Uid=sa;Pwd=*****',
'SELECT COL1, COL2 FROM ClientDB.dbo.TB_ClientTable')

SELECT COL1,COL2 FROM LocalDB.dbo.TB_ClientTable

OPENROWSET部分返回您插入的行集。你不能把任何复杂的东西放在那里,或者它不知道如何插入它。

但你应该看一下SSIS - 看起来你正试图做某种差分数据逻辑(你的问题中没有提到)