我想将一些表从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
有时候我不会一直收到以下错误:
拒绝访问远程服务器,因为不存在登录映射
在sys.servers中找不到服务器'ClientSide \ SQLEXPRESS'。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。
请帮我解决这个问题。这真的让我发疯了。我查了很多文章,但我无法弄清楚我错在哪里。
感谢您的帮助。
第二次编辑:
使用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进行上述操作。请指导我
答案 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 - 看起来你正试图做某种差分数据逻辑(你的问题中没有提到)