跨服务器SQL存储过程报错排查及昨日数据过滤更新需求
问题解决方案
1. 修复"Invalid object name"错误
源表Response_Master_Incident位于另一台服务器cadarchive,必须通过完全限定的跨服务器表名引用,操作如下:
- 确认
ucpdapps2服务器已配置指向cadarchive的链接服务器(未配置的话需先完成链接配置) - 将存储过程中源表的引用改为完整路径:
[cadarchive].[你的源数据库名].[dbo].[Response_Master_Incident]
(替换你的源数据库名为实际数据库名称,比如源表在cadarchive的CADSystemDB中,就写成[cadarchive].[CADSystemDB].[dbo].[Response_Master_Incident])
2. 修改存储过程实现仅同步昨日数据
原存储过程用SELECT INTO会重复创建目标表,而你已存在Master_Incident_For_ProQA表,因此改用INSERT INTO ... SELECT做增量同步,同时添加日期过滤逻辑:
修正后的存储过程代码
CREATE PROCEDURE UpdateProQATable AS BEGIN SET NOCOUNT ON; -- 插入昨日符合条件的新数据,避免重复 INSERT INTO Master_Incident_For_ProQA ( [ID], [Master_Incident_Number], [Response_Date], [Problem], [MethodOfCallRcvd], [CallTaking_Performed_By], [EMD_Used], [Determinant], [ProQa_CaseNumber], [ProQa_CaseNumber_Fire], [ProQa_CaseNumber_Police], [MachineName] ) SELECT [ID], [Master_Incident_Number], [Response_Date], [Problem], [MethodOfCallRcvd], [CallTaking_Performed_By], [EMD_Used], [Determinant], [ProQa_CaseNumber], [ProQa_CaseNumber_Fire], [ProQa_CaseNumber_Police], [MachineName] FROM [cadarchive].[你的源数据库名].[dbo].[Response_Master_Incident] WHERE EMD_Used = '1' -- 过滤昨日的数据(兼容datetime类型的Response_Date) AND CONVERT(DATE, Response_Date) = DATEADD(DAY, -1, CONVERT(DATE, GETDATE())) -- 排除目标表已存在的记录(按ID判断,可根据业务调整匹配字段) AND NOT EXISTS ( SELECT 1 FROM Master_Incident_For_ProQA t WHERE t.ID = [Response_Master_Incident].ID ); END
补充说明
- 若
Response_Date本身是DATE类型,可简化日期条件为Response_Date = DATEADD(DAY, -1, GETDATE()) - 若需要同步时更新已有记录(而非仅插入新数据),可替换为
MERGE语句实现增改同步 - 确保执行存储过程的账号拥有访问
cadarchive服务器源表的权限
内容的提问来源于stack exchange,提问作者WGraulich
相关产品推荐
相关产品推荐

