大家请帮帮忙,使用sp_addlinkedserver连接数据库的问题,在线等待。。。。立即给分

shellworld 2004-07-28 02:50:58
DECLARE @srv_link char(20)
DECLARE @login_name char(20)
DECLARE @login_pwd char(20)

SET @srv_link='192.168.3.199'
SET @login_name='sa'
SET @login_pwd = ''

exec sp_addlinkedserver @srv_link,'', 'SQLOLEDB', 'abc'
exec sp_addlinkedsrvlogin @srv_link,'false',null,@login_name,@login_pwd


EXEC('SELECT * INTO src_tb FROM ' + @srv_link + '.db1.dbo.tb')

exec sp_dropserver @srv_link, 'droplogins'

执行报错:

所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '192.168' 附近有语法错误。

(所影响的行数为 1 行)


(所影响的行数为 1 行)

...全文
247 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
aht1979 2004-07-30
  • 打赏
  • 举报
回复
这个问题我刚解决,这种形式用addlinkedserver解决很麻烦,我用的openrowset解决的
这个存储过程的功能:许多客户端对应一个服务器端,客户端和服务器端都有各自的数据。但是服务器端负责统筹管理客户端,服务器端事先会生成一些店铺号(也就是存储过程里的@shoppe_id参数),客户选择其中一个向其注册,这时候根据店铺号从服务器端获取相应的详细信息插入客户端的数据库内,同时更新服务端内该店铺的可用状态(bos_shoppe内的shoppe_status),表示该店铺号已经被注册。在系统内店铺号这能注册或删除,因此删除操作是注册的反操作

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_configLocal]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_configLocal]
GO

create proc sp_configLocal @m_flag int,
@server_name varchar(50),
@uid varchar(50),
@pwd varchar(50),
@shoppe_id varchar(6)

as
declare @sql varchar(4000)
declare @qry varchar(4000)
declare @shoppe varchar(5)
begin
if @m_flag = 1 --判断是否已经设置过
begin
if exists(select * from bos_sys where status=1)
return 1
else
return 0
end
if @m_flag = 2
begin
select * from bos_sys where status = 1
end
if @m_flag = 3
begin
select shoppe_id from SaleMarket.dbo.bos_shoppe where shoppe_status = 0 and status = 1 order by shoppe_id
end
if @m_flag = 4
begin
begin tran del_sys
--将本地设置表里的数据清空
delete from bos_sys
if @@error > 0
begin
rollback tran del_sys
return -100
end
--判断临时表是否存在,如存在则删除之
if exists(select * from sysobjects where id = object_id('afc') and objectproperty(id,N'ISUserTable') = 1)
begin
drop table afc
if @@error > 0
begin
rollback tran del_sys
return -100
end
end
commit tran del_sys

--从服务器查询用户所选店铺号对应的详细信息
set @qry = 'select a.shoppe_id,a.shoppe_name,a.shoppe_father ,a.shoppe_provider,a.iscasher,a.iskucun,a.ismod,getdate() as back_lastdate,a.status
from SaleMarket.dbo.bos_shoppe a where status = 1 and a.shoppe_id = '+''''''+@shoppe_id+''''''
set @sql = ' select a.* into afc from OPENROWSET(''SQLOLEDB'','+''''+@server_name+''''+';'+''''+@uid+''''+';'+''''+@pwd+''''+','+''''+@qry+''''+') as a'
--将其信息插入客户端数据库
exec(@sql)
if @@error > 0
begin
return -100
end
--更新服务器端的shoppe_status
set @sql = 'update openrowset(''SQLOLEDB'','+''''+@server_name+''''+';'+''''+@uid+''''+';'+''''+@pwd+''''+',SaleMarket.dbo.bos_shoppe) set shoppe_status = 1 where shoppe_id = '+''''+@shoppe_id+'''' +'and status = 1'
exec(@sql)
if @@error > 0
begin
return -100
end
begin tran save_sys
--将客户端临时表内的数据导入bos_sys
insert into bos_sys
select top 1 a.*,null,null,null from afc a order by shoppe_id
if @@error > 0
begin
rollback tran save_sys
return -100
end
--删除临时表
drop table afc
if @@error > 0
begin
rollback tran save_sys
return -100
end
commit tran save_sys

select * from bos_sys where status = 1
return 100
end
if @m_flag = 5 --删除本地设置
begin
set @sql = 'update openrowset(''SQLOLEDB'','+''''+@server_name+''''+';'+''''+@uid+''''+';'+''''+@pwd+''''+',SaleMarket.dbo.bos_shoppe) set shoppe_status = 0 where shoppe_id = '+''''+@shoppe_id+'''' +'and status = 1'
exec(@sql)
if @@error > 0
begin
return -100
end
--将本地设置表里的数据清空
delete from bos_sys
if @@error > 0
begin
return -100
end
select * from bos_sys where status = 1
return 100
end
end
haoK 2004-07-29
  • 打赏
  • 举报
回复
EXEC('SELECT * INTO src_tb FROM ' + @srv_link + '.db1.dbo.tb')

这句改一下

EXEC('SELECT * INTO src_tb FROM [' + @srv_link + '].db1.dbo.tb')

ip的形式不符合命名要求 点太多:)
pbsql 2004-07-29
  • 打赏
  • 举报
回复
一样的可以变量:
DECLARE @srv_link varchar(20)
DECLARE @login_name varchar(20)
DECLARE @login_pwd varchar(20)

SET @srv_link='192.168.3.199'
SET @login_name='sa'
SET @login_pwd = ''

exec('
SELECT *
FROM OPENDATASOURCE(
''SQLOLEDB'',''Data Source='+@srv_link+';User ID='+@login_name+';Password="'+@login_pwd+'"''
).Northwind.dbo.Categories
')
shellworld 2004-07-28
  • 打赏
  • 举报
回复
这个也是一样涉及到变量的问题,servername, myuid,mypass使用变量的话怎么表达呀???
pbsql 2004-07-28
  • 打赏
  • 举报
回复
那你不如用下面这样的格式:
SELECT *
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerName;User ID=MyUID;Password=MyPass'
).Northwind.dbo.Categories
shellworld 2004-07-28
  • 打赏
  • 举报
回复
网络情况限制,使用IP比较方便,有其他方法可以使用IP来执行吗??
pbsql 2004-07-28
  • 打赏
  • 举报
回复
SET @srv_link='192.168.3.199'--我的意思是这里用名称而非IP
mfc2003 2004-07-28
  • 打赏
  • 举报
回复
up
shellworld 2004-07-28
  • 打赏
  • 举报
回复
可是我的srv_link不是固定的,需要使用变量,而不能使用常量。
pbsql 2004-07-28
  • 打赏
  • 举报
回复
不能这样:
EXEC('SELECT * INTO src_tb FROM 192.168.3.199.db1.dbo.tb')

改为名称试试:EXEC('SELECT * INTO src_tb FROM srv.db1.dbo.tb')
--假设192.168.3.199名称是srv

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧