sql 数据库级联所遇问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 00:07:12
/*仓储存储过程*/
if exists (select 1
from sysobjects
where id = object_id('PMsgmsg001')
and type = 'P')
drop procedure PMsgmsg001
go
cREATE procedure PMsgmsg001
with encryption AS
begin
exec sp_addlinkedserver "ERP", " ", "SQLOLEDB", "数据库"
exec sp_addlinkedsrvlogin "ERP", "false",null, "sa", "密码"
select *
into TDefAttrib
from ERP.spiderking.dbo.TDefAttrib
--删除链接服务器
exec sp_dropserver "erp", "droplogins "
end

需要先进行级联才能执行,如果未进行级联则提示:
服务器: 消息 7202,级别 11,状态 2,过程 PMsgmsg001,行 8
在 sysservers 中未能找到服务器 'ERP'。请执行 sp_addlinkedserver 以将服务器添加到 sysservers。

疑问:数据库级联语句不是在前面,先执行到的吗?请问如何解决

如果批查询中涉及到链接服务器,SQL Server要先验证链接服务器的有效性,在你的批查询中,虽然创建链接服务器的语句在前,但验证比创建语句还要早,所以会出错。
解决方法是把select into语句作为字符串来执行。
if exists (select 1 from sysobjects where id = object_id('PMsgmsg001') and type = 'P')
drop procedure PMsgmsg001
go
CREATE procedure PMsgmsg001
with encryption AS
begin
exec sp_addlinkedserver 'ERP', '', 'SQLOLEDB', '数据库'
exec sp_addlinkedsrvlogin 'ERP', 'false',null, 'sa', '密码'
exec ('select * into TDefAttrib from ERP.spiderking.dbo.TDefAttrib ')
--删除链接服务器
exec sp_dropserver 'erp', 'droplogins '
end

你在最前面加个use 数据库名;