跨服务器问题,求助

ajdkjalj 2018-06-15 04:14:50
在本地的服务器的表上创建了触发器,也通过语句
exec sp_addlinkedserver 'U8SV','','SQLOLEDB','远程服务器名或ip地址'
exec sp_addlinkedsrvlogin 'U8SV','false',null,'用户名','密码'go
创建了链接服务器,查询分析器里查询远程服务器上表数据没有问题,但是执行触发器的时候就提示

PO_Podetails是我触发器所在的表名,是不是要加入本地的数据库名什么的,关键代码如下

insert into U8SV.CRMKLRJ.dbo.费用申请单主表(WorkFlowGUID,WorkFlowInstanceCode,AgencyID,DepartmentID,Initiateuserguid,InitiateDate,IsFinished,
申请人,创建人,备注,金额合计大写,金额合计小写,付款方式,收款银行,银行账号,申请金额合计,申请金额合计大写)
select @gid,@WorkFlowInstanceCode,@AgencyID,@DepartmentID,@Initiateuserguid,CONVERT(varchar(100), GETDATE(), 21),0,@申请人,@申请人,
(select cMemo from PO_Pomain where POID=(select top 1 POID from inserted)),
'零元整',0,(select cDefine1 from PO_Pomain where POID=(select top 1 POID from inserted)),(select cVenBank from PO_Pomain
where POID=(select top 1 POID from inserted)),
(select cVenAccount from PO_Pomain where POID=(select top 1 POID from inserted)),(select SUM(iNatSum) from inserted),
dbo.[fn_getformatmoney]((select SUM(iNatSum) from inserted))

...全文
954 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-06-19
  • 打赏
  • 举报
回复
看到你有些字段是计算好了再放变量, 有些又不是。 何不统一这样呢(计算好放变量,然后插入语句不再有 select 语句)?
ajdkjalj 2018-06-19
  • 打赏
  • 举报
回复
我找到一点线索,上面提示的"TmpPU_2161635105_573E4680E51A4E0FA7121E2B26F655A9PO_PODetails_Detail"是软件创建的临时表,然后我在触发器里写查询远程服务器语句
select * from U8SV.CRMKLRJ.dbo.费用申请单主表
就没报错,但是换成插入语句就报错,这是为什么
ajdkjalj 2018-06-19
  • 打赏
  • 举报
回复
上面少了插入语句
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[Makebaoxiaodan]') and OBJECTPROPERTY(id, N'IsTrigger') = 1) 
   drop trigger Makebaoxiaodan
   go
create trigger Makebaoxiaodan
on PO_Podetails
after insert,update
as
begin tran tran_Update --开始事务

declare @tran_error int;
set @tran_error=0;
begin try
	--插主表数据
	declare @gid uniqueidentifier,
	@type nvarchar(80),  --业务类型
	@WorkFlowInstanceCode nvarchar(100),
	@AgencyID int,
	@DepartmentID int,
	@Initiateuserguid uniqueidentifier,
	@申请人 nvarchar
	set @gid=newid()
	 
	select @type=cBusType from PO_Pomain where POID=(select top 1 POID from UFDATA_123_2018.dbo.inserted)
	select @WorkFlowInstanceCode='费用申请单-'+CONVERT(varchar(100), GETDATE(), 112)+'-'+cast(right(MAX(WorkFlowInstanceCode),4)+1 as nvarchar) from	U8SV.CRMKLRJ.dbo.费用申请单主表
	select @AgencyID=AgencyID,@DepartmentID=DepartmentID from U8SV.CRMKLRJ.dbo.DepartmentTable where DepartmentName=(select cDepName from Department	where cDepCode=(select cDepCode from PO_Pomain where POID=(select top 1 POID from inserted)))
	select @Initiateuserguid=UserGuid from U8SV.CRMKLRJ.dbo.EmployeeTable where Username=(select cMaker from PO_Pomain where 
	POID=(select top 1 POID from inserted))
	select @申请人=cMaker from	PO_Pomain where POID=(select top 1 POID from inserted)
	insert into U8SV.CRMKLRJ.dbo.费用申请单主表(WorkFlowGUID,WorkFlowInstanceCode,AgencyID,DepartmentID,Initiateuserguid,InitiateDate,IsFinished,
	申请人,创建人,备注,金额合计大写,金额合计小写,付款方式,收款银行,银行账号,申请金额合计,申请金额合计大写)
	select @gid,@WorkFlowInstanceCode,@AgencyID,@DepartmentID,@Initiateuserguid,CONVERT(varchar(100), GETDATE(), 21),0,@申请人,@申请人,
	(select cMemo from dbo.PO_Pomain where POID=(select top 1 POID from dbo.inserted)),
	'零元整',0,(select cDefine1 from dbo.PO_Pomain where POID=(select top 1 POID from dbo.inserted)),(select cVenBank from dbo.PO_Pomain
	 where POID=(select top 1 POID from dbo.inserted)),
	(select cVenAccount from dbo.PO_Pomain where POID=(select top 1 POID from dbo.inserted)),(select SUM(iNatSum) from dbo.inserted),
	dbo.[fn_getformatmoney]((select SUM(iNatSum) from dbo.inserted))
end try
begin catch
  set @tran_error=@tran_error+1; --加分号或不加都能正常执行
end catch
if(@tran_error>0)
begin
  rollback tran; --执行出错,回滚事务(不指定事务名称)
end 
else
begin
  commit tran; --没有异常,提交事务(不指定事务名称)
ajdkjalj 2018-06-19
  • 打赏
  • 举报
回复
引用 3 楼 RINK_1 的回复:
你贴的代码里面哪里有用到 PO_Podetails这张表。还有,你说的表名是PO_Podetails,和错误提示里的表名也不一样,是不是调用的那个函数有问题。 确实像#1版主说的那样,你先把插入的各个值赋给参数,再通过参数去执行插入语句,看上去能清楚很多。
引用 1 楼 yenange 的回复:
不明白为什么要搞这么复杂? 复杂的东西, 出错的机率大很多。 先把乱七八糟的东西全部替换成普通的参数吧, 全部算好了放参数里面, 再用一个简单 insert 语句插入。
因为是第三方开发,我们公司是代理没有源码,参数没法传,跨服务器是因为我们代理的软件所在服务器,和客户用的OA系统所在服务器不在一个服务器上,为什么提示的信息和我提供的表名不一致我也没弄懂,前面全是乱码,贴个完整脚本,用事务是要更新多个表,其他表我注释了,只更新一个表也报上面的错
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[Makebaoxiaodan]') and OBJECTPROPERTY(id, N'IsTrigger') = 1) 
   drop trigger Makebaoxiaodan
   go
create trigger Makebaoxiaodan
on PO_Podetails
after insert,update
as
begin tran tran_Update --开始事务

declare @tran_error int;
set @tran_error=0;
begin try
	--插主表数据
	declare @gid uniqueidentifier,
	@type nvarchar(80),  --业务类型
	@WorkFlowInstanceCode nvarchar(100),
	@AgencyID int,
	@DepartmentID int,
	@Initiateuserguid uniqueidentifier,
	@申请人 nvarchar
	set @gid=newid()
	 
	select @type=cBusType from PO_Pomain where POID=(select top 1 POID from UFDATA_123_2018.dbo.inserted)
	select @WorkFlowInstanceCode='费用申请单-'+CONVERT(varchar(100), GETDATE(), 112)+'-'+cast(right(MAX(WorkFlowInstanceCode),4)+1 as nvarchar) from	U8SV.CRMKLRJ.dbo.费用申请单主表
	select @AgencyID=AgencyID,@DepartmentID=DepartmentID from U8SV.CRMKLRJ.dbo.DepartmentTable where DepartmentName=(select cDepName from Department	where cDepCode=(select cDepCode from PO_Pomain where POID=(select top 1 POID from inserted)))
	select @Initiateuserguid=UserGuid from U8SV.CRMKLRJ.dbo.EmployeeTable where Username=(select cMaker from PO_Pomain where 
	POID=(select top 1 POID from inserted))
	select @申请人=cMaker from	PO_Pomain where POID=(select top 1 POID from inserted)
 end try
begin catch
  set @tran_error=@tran_error+1; --加分号或不加都能正常执行
end catch
if(@tran_error>0)
begin
  rollback tran; --执行出错,回滚事务(不指定事务名称)
end 
else
begin
  commit tran; --没有异常,提交事务(不指定事务名称)

ajdkjalj 2018-06-19
  • 打赏
  • 举报
回复
引用 7 楼 yenange 的回复:
看到你有些字段是计算好了再放变量, 有些又不是。 何不统一这样呢(计算好放变量,然后插入语句不再有 select 语句)?
下次规范,只是我不明白,TmpPU_2161635105_573E4680E51A4E0FA7121E2B26F655A9PO_PODetails_Detail这个临时表是软件调用的表,我既没有查询,也没有写这个表,和我八竿子打不着,怎么就它报错了
RINK_1 2018-06-15
  • 打赏
  • 举报
回复
你贴的代码里面哪里有用到 PO_Podetails这张表。还有,你说的表名是PO_Podetails,和错误提示里的表名也不一样,是不是调用的那个函数有问题。 确实像#1版主说的那样,你先把插入的各个值赋给参数,再通过参数去执行插入语句,看上去能清楚很多。
shinger126 2018-06-15
  • 打赏
  • 举报
回复
触发器不能直接拿出来执行的,最起码里面的inserted和deleted表就没有,直接会报错
吉普赛的歌 2018-06-15
  • 打赏
  • 举报
回复
不明白为什么要搞这么复杂? 复杂的东西, 出错的机率大很多。 先把乱七八糟的东西全部替换成普通的参数吧, 全部算好了放参数里面, 再用一个简单 insert 语句插入。

27,580

社区成员

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

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