为什么这个存储的内容能一步步执行但就是不能一次全部执行通过呢?

cquyuyan 2008-03-30 08:58:53
create proc sp_InnerImport
(
@serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='RemoteServer'
)
begin
exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'

exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'
--总是在下面报错
--select * from RemoteServer.Test.dbo.abc
select *
FROM openquery(RemoteServer, 'SELECT * FROM Test.dbo.User ')

exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
go
...全文
122 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyflystone 的回复:]
一般情况下linkserver是创建好了不删除的,方便再次调用
[/Quote]


我之所以这么做是因为我用下面的语句查出来的,如果不删除的话,关联远程服务器就不会变
select * from master.dbo.sysservers
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
为什么用这句就是可以了呢?
exec('select * FROM openquery(RemoteServer,''SELECT * FROM Test.dbo.abc '')')
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
我现在是这样写的,又可以F5反复创建存储过程了

if exists(select * from sysobjects where xtype='P' and name='sp_InnerImport')
drop proc sp_InnerImport
go

create proc sp_InnerImport
(
@serverIP nvarchar(32)
)
as
begin
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='RemoteServer'
)
begin
exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc=@serverIP

exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'



--select * from RemoteServer.Test.dbo.abc
--select * FROM openquery(RemoteServer, 'SELECT * FROM Test.dbo.abc ')

--waitfor delay '00:00:05'
exec('select * FROM openquery(RemoteServer,''SELECT * FROM Test.dbo.abc '')')

exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
go



-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
稍稍延迟,保证linkserver创建成功呀
-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
waitfor delay '00:00:05'

改小


waitfor delay '00:00:02'
如果还慢但是结果 正常时


waitfor delay '00:00:01'
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
create proc sp_InnerImport
(
@serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='.'
)
begin
exec sp_dropserver @server='.',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'

exec sp_addlinkedsrvlogin @rmtsrvname='.',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'
--总是在下面报错
--select * from RemoteServer.Test.dbo.abc
waitfor delay '00:00:05'
exec('select *
FROM openquery(RemoteServer,''SELECT * FROM Test.dbo.User '')')

exec sp_dropserver @server='.',@droplogins='droplogins'
end
go




这个可以反复创建了, 但是,我在使用的时候总是显示正在执行批查询, 比刚才多花很长时间才能够出结果. 这又是为什么呢?

刚才只要能够创建成功就能够很快出结果,因为waitfor delay '00:00:05' 吗? 为什么要有这个语句?
viva369 2008-03-30
  • 打赏
  • 举报
回复
或者你试试这样的写法


EXEC sp_addlinkedserver 'mbo-srv-05', N'SQL Server'
exec sp_addlinkedsrvlogin 'mbo-srv-05','false',null,'sa','Password01!';
exec ( 'use dmsdb select * from menu' )
at
[mbo-srv-05]

viva369 2008-03-30
  • 打赏
  • 举报
回复
+go不会退出的,又不是return

存储过程一般是在你第一次调用的时候执行解析的。
-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
waitfor delay '00:00:05'
exec('select *
FROM openquery(RemoteServer,''SELECT * FROM Test.dbo.User '')')
---

这样也不对呀?
那是你的链接服务器没有先存在,你就select当然会报错的呀
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
你们两位的办法都不对嘛,特别是viva369的,存储过程里都go了,就立即退出了,后面的查询是根本不能够执行的,

总之还是报那个错, 而且很奇怪的是, 我下楼打杯水过一会后就又能够重新创建成功了, 而且连续按F5都不报错, 但就在执行成功停几秒后再执行又开始报错了.这是怎么回事情呀??
-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
create proc sp_InnerImport 
(
@serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='.'
)
begin
exec sp_dropserver @server='.',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'

exec sp_addlinkedsrvlogin @rmtsrvname='.',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'
--总是在下面报错
--select * from RemoteServer.Test.dbo.abc
waitfor delay '00:00:05'
exec('select *
FROM openquery(RemoteServer,''SELECT * FROM Test.dbo.User '')')

exec sp_dropserver @server='.',@droplogins='droplogins'
end
go


drop proc sp_InnerImport
-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
那是你没有先创建linkserver
cquyuyan 2008-03-30
  • 打赏
  • 举报
回复
服务器: 消息 7202,级别 11,状态 2,过程 sp_InnerImport,行 27
在 sysservers 中未能找到服务器 'RemoteServer'。请执行 sp_addlinkedserver 以将服务器添加到 sysservers。
viva369 2008-03-30
  • 打赏
  • 举报
回复


create proc sp_InnerImport
(
@serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='RemoteServer'
)
begin
exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'

exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'
--总是在下面报错 ,
--+go,批处理结束
go

--select * from RemoteServer.Test.dbo.abc
select *
FROM openquery(RemoteServer, 'SELECT * FROM Test.dbo.User ')

exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
go
-狙击手- 2008-03-30
  • 打赏
  • 举报
回复
一般情况下linkserver是创建好了不删除的,方便再次调用


---try:


create proc sp_InnerImport 
(
@serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
set nocount on
if exists(select 1
from master.dbo.sysservers
where srvname='RemoteServer'
)
begin
exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
exec sp_addlinkedserver @server='RemoteServer',
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='127.0.0.1'

exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
@useself='false',
@locallogin=null,
@rmtuser='sa',
@rmtpassword='zrx'
--总是在下面报错
--select * from RemoteServer.Test.dbo.abc
waitfor delay '00:00:05'
select *
FROM openquery(RemoteServer, 'SELECT * FROM Test.dbo.User ')

exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
go

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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