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

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
...全文
144 15 打赏 收藏 转发到动态 举报
写回复
用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
内容概要:本文围绕“多主体综合能源系统+分布式ADMM研究”展开,系统阐述了交替方向乘子法(ADMM)在多主体综合能源系统中的分布式优化应用,提供了完整的Matlab代码实现。研究聚焦于多利益主体之间的协同优化问题,通过建立合理的数学模型,采用ADMM算法实现去中心化的求解架构,有效保障各主体的数据隐私性与决策自主性,同时提升整体系统的计算效率与优化性能。内容涵盖系统建模、优化问题分解、ADMM迭代求解流程、收敛性验证及结果分析,具有较强的理论深度与工程实践价值,适用于能源互联网、微电网群、园区综合能源系统等复杂场景的能量管理与协调调度。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、高校科研人员,以及从事综合能源系统规划、微电网优化、分布式能源管理等方向的工程技术人员。; 使用场景及目标:①应用于多主体参与的综合能源系统能量管理与协同优化调度;②帮助读者深入理解ADMM算法的分解-协调机制及其在分布式优化中的具体实现,支撑高水平学术论文复现、科研课题攻关或实际工程项目开发;③推动智能电网与能源互联网中去中心化、隐私保护型优化调度技术的发展与落地; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,逐行调试并可视化关键变量的迭代过程,深入掌握ADMM算法的参数设置、收敛判据及数值稳定性处理技巧,并尝试将其拓展至电动汽车集群调度、多微电网互动、可再生能源消纳等其他分布式优化应用场景中进行仿真验证。

34,875

社区成员

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

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