最后60分补充,上1个100分的问题.
原帖:http://bbs.csdn.net/topics/390304883
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[yusp_tongbu]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[yusp_tongbu]
GO
create procedure yusp_tongbu
as
begin
declare @from_server varchar(256)--来源服务器
declare @from_dbname varchar(256)--来源数据库
declare @from_user varchar(256)--来源用户名
declare @from_pwd varchar(256)--来源密码
set @from_server = 'DBSERVER'
set @from_dbname = 'MYDB'
set @from_user = 'sa'
set @from_pwd = 'pwd'
EXEC sp_addlinkedserver @server='DBVIP',@srvproduct='',@provider='SQLOLEDB',@datasrc=@from_server
EXEC sp_addlinkedsrvlogin 'DBVIP','false',NULL, @from_user,@from_pwd
--go--如果这里加上GO,在非存储过程下是可以执行的
select top 5 * from DBVIP.REANSON.dbo.INVMB
Exec sp_droplinkedsrvlogin DBVIP,Null
Exec sp_dropserver DBVIP
end
go
exec yusp_tongbu
[最优解释]
go是批处理结束标志 存储过程中不能使用
[其他解释]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[yusp_tongbu]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[yusp_tongbu]
GO
create procedure yusp_tongbu
as
begin
declare @from_server varchar(256)--来源服务器
declare @from_dbname varchar(256)--来源数据库
declare @from_user varchar(256)--来源用户名
declare @from_pwd varchar(256)--来源密码
declare @sql varchar(max)--SQL语句
set @from_server = '[huang-pc]'
set @from_dbname = 'tempdb'
set @from_user = 'sa'
set @from_pwd = 'xxxx'
set @sql = 'select top 5 * from [10.20.30.202\prodsqlserver].tempdb.dbo.csdn'
EXEC sp_addlinkedserver @server='10.20.30.202\prodsqlserver',@srvproduct='',@provider='SQLOLEDB',@datasrc=@from_server
EXEC sp_addlinkedsrvlogin '10.20.30.202\prodsqlserver','false',NULL, @from_user,@from_pwd
exec (@SQL)
Exec sp_droplinkedsrvlogin [10.20.30.202\prodsqlserver],Null
Exec sp_dropserver [10.20.30.202\prodsqlserver]
end
go
exec yusp_tongbu
如果非要这种形式,建议按以上执行,应该不会出现找不到服务器的错了.
[其他解释]
单独执行SQL,就是上面加了"GO"那块,我执行是OK了.
但因为特殊需求,以上操作我要封装到存储过程中,,,
同样的SQL封装到存储过程中,却无法执行了,有高手帮忙看看么?
[其他解释]
有什么问题啊
[其他解释]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[yusp_tongbu]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[yusp_tongbu]
GO--这个去掉
create procedure yusp_tongbu
as
begin
declare @from_server varchar(256)--来源服务器
declare @from_dbname varchar(256)--来源数据库
declare @from_user varchar(256)--来源用户名
declare @from_pwd varchar(256)--来源密码
set @from_server = 'DBSERVER'
set @from_dbname = 'MYDB'
set @from_user = 'sa'
set @from_pwd = 'pwd'
EXEC sp_addlinkedserver @server='DBVIP',@srvproduct='',@provider='SQLOLEDB',@datasrc=@from_server
EXEC sp_addlinkedsrvlogin 'DBVIP','false',NULL, @from_user,@from_pwd
--go--如果这里加上GO,在非存储过程下是可以执行的
select top 5 * from DBVIP.REANSON.dbo.INVMB
Exec sp_droplinkedsrvlogin DBVIP,Null
Exec sp_dropserver DBVIP
end
go
exec yusp_tongbu
[其他解释]
如果不执行GO,以上存储过程执行无效!
[其他解释]
那个贴回复你了
[其他解释]
你这个只是临时访问数据,为什么不用openrowset?
[其他解释]
回:DBA_Huangzj,你那个还是不行.
[其他解释]
我是期望达到目的,方法不限...
你说的那个方法怎么做?
[其他解释]
晕,看错了,应该是里面的go去掉,那你用begin/end来替代go试试
[其他解释]
版主老大,我试了,还是不行呢.
[其他解释]
那完全不加go呢?
[其他解释]
新建另一存程,把GO上面的句到新的存程,然後在存程用新建的那存程.
[其他解释]
版主,这个存储过程,测试环境很容易搭建,你那边能帮忙搭建测试1下么?
[其他解释]
我就是在本机测了一下没问题我才叫你试试,这个是我测试的:没啥问题啊
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[yusp_tongbu]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[yusp_tongbu]
GO
create procedure yusp_tongbu
as
begin
declare @from_server varchar(256)--来源服务器
declare @from_dbname varchar(256)--来源数据库
declare @from_user varchar(256)--来源用户名
declare @from_pwd varchar(256)--来源密码
set @from_server = '[huang-pc]'
set @from_dbname = 'tempdb'
set @from_user = 'sa'
set @from_pwd = 'xxxx'
EXEC sp_addlinkedserver @server='10.20.30.202\prodsqlserver',@srvproduct='',@provider='SQLOLEDB',@datasrc=@from_server
EXEC sp_addlinkedsrvlogin '10.20.30.202\prodsqlserver','false',NULL, @from_user,@from_pwd
--go--如果这里加上GO,在非存储过程下是可以执行的
select top 5 * from [10.20.30.202\prodsqlserver].tempdb.dbo.csdn
Exec sp_droplinkedsrvlogin [10.20.30.202\prodsqlserver],Null
Exec sp_dropserver [10.20.30.202\prodsqlserver]
end
go
exec yusp_tongbu
[其他解释]
该回复于2012-12-06 17:48:38被管理员删除
[其他解释]
版主能帮忙看看么?
[其他解释]
学习了 我也正在学存储过程
[其他解释]
据我所知好像存储过程中的语句是从as开发到go结束,也就是说第一个go之后的内容不属于存储过程了.临时性查询建议使用 即席分布式查询使用 OPENROWSET 和 OPENDATASOURCE 函数连接到使用 OLE DB 的远程数据源。
示例如下:
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
SELECT *
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=数据库名称或IP;User ID=用户名;Password=密码'
).Northwind.dbo.Categories
[其他解释]
你傻啊,直接执行我的脚本,服务器是我这边的内网的,你怎么可能连到呢。
[其他解释]
你开启连接服务器,一次就可以了,所以没必要封装到存储过程里面。开启之后你就可以使用select * from [实例名].[库名].[架构名].[表名]这样来使用。
[其他解释]
老大,用我这边的一样啊.
问题就是 如果不执行那个 GO, 都会说找不到服务器.