SQL:跨服务器同步某个字段

在 10.1服务器有3个数据库,其中一个数据库命名为 mes,MES有一张员工信息表HR,HR有入职时间,姓名,部门等字段
在10.3服务器有2个数据库,其中一个数据库命名为 mes1,MES1有一张员工信息表HR,HR有入职时间,姓名,部门等字段

需求: 10.1的HR信息要每天2个时间段同步到 10.3的HR信息去。请问SQL 怎么写(不是插入,是同步字段)
A字段路径:MES.dbo.hrEmployee.dEnterDate
b字段路径:[10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise

UPDATE MES.dbo.hrEmployee
SET dEnterDate = [10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise
FROM MES.dbo.hrEmployee
INNER JOIN  [10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise
ON MES.dbo.hrEmployee.sEmployeeNo = [10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise

现在遇见了几个问题:
消息 4104,级别 16,状态 1,第 31 行
无法绑定由多个部分组成的标识符

请问怎么优化,不报错

是sql server吗?不知道楼上的gpt都在瞎写什么,sql里有链接服务器,在那里可以直接执行更新语句

不是插入 , 是更新

补全全路径表名可以解决,什么数据库

看了你的需求,可以考虑使用触发器来实现,当对B数据库字段进行新增、更新、删除操作之后,可以触发一个动作,触发器可以获取到每次变更的数据记录,拿到这个数据记录就可以去更新A数据库中对应的数据。

将字段路径 [10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise 修改为 [10.3].[MES1].[dbo].[vw_MES_sync_person].[fd_time_of_enterprise],以将其作为表名而不是列名。
在INNER JOIN子句中,将 [10.3].[MES1].[dbo].[vw_MES_sync_person] 作为表名使用,而不是列名。

可以使用SQL Server Linked Server 功能进行同步

可以10.1中查询了,然后更新到10.3中去,就是在代码中先用一个sql查询出来,然后在调用另一个sql进行更新

根据问题描述和给出的UPDATE语句,出现错误的原因可能是缺少JOIN条件的连接字段。需要在ON子句中明确指定MES.dbo.hrEmployee和[10.3].[MES1].[dbo].[vw_MES_sync_person].fd_time_of_enterprise之间的连接字段,还有其他问题可以回复我

img

引用GPT回答:在这种情况下,你可以使用 SQL Server 的链接服务器功能来解决问题。首先,你需要在 10.3 服务器上创建一个链接服务器,以连接到 10.1 服务器。然后,你可以通过编写一个触发器或定期运行一个作业来实现数据同步。

以下是一个示例代码,实现将 10.1 的 HR 表中的数据每天两个时间段同步到 10.3 的 HR 表:

  1. 在 10.3 服务器上创建链接服务器:
EXEC sp_addlinkedserver   
   @server = 'LinkedServerName',  -- 链接服务器的名称
   @srvproduct = '',
   @provider = 'SQLNCLI',   -- 链接服务器使用的提供程序
   @datasrc = '10.1.服务器.IP'  -- 10.1 服务器的 IP 地址
  1. 创建一个存储过程,在其中实现数据同步逻辑:
CREATE PROCEDURE dbo.SyncHRInfo
AS
BEGIN
    -- 将 10.1 HR 表中的数据插入到 10.3 HR 表中
    INSERT INTO mes1.dbo.HR (入职时间, 姓名, 部门)
    SELECT 入职时间, 姓名, 部门
    FROM LinkedServerName.mes.dbo.HR

    -- 可以在此处添加其他必要的逻辑,例如更新已存在的数据等

END
  1. 创建一个定时任务或触发器,用于定期运行存储过程:
-- 在每天的两个时间段运行存储过程
CREATE EVENT TRIGGER SyncHRInfoTrigger
ON SCHEDULE
    EVERY '12:00:00', '18:00:00'  -- 设置两个时间段
DO EXEC dbo.SyncHRInfo

要实现跨服务器同步某个字段的需求,你可以使用 SQL Server 的 Linked Server 功能。以下是一种可能的解决方案:

在 10.3 服务器上创建 Linked Server:

在 SSMS(SQL Server Management Studio)中连接到 10.3 服务器。
右键单击 "服务器对象" -> "链接服务器" -> "新建链接服务器"。
在 "常规" 选项卡中,填写 Linked Server 的名称和远程服务器的网络地址。
在 "安全性" 选项卡中,选择适当的身份验证方式并提供登录凭据。
完成后点击 "确定" 创建 Linked Server。
在 10.1 服务器上编写触发器:

在 10.1 服务器上打开 SSMS 连接到对应数据库。
编写一个触发器,以在 HR 表发生更改时将相关字段的数据插入到 Linked Server 上的 MES1 数据库的 HR 表。
触发器可以在 INSERT、UPDATE 或 DELETE 操作时执行,根据你的需求进行相应的更改操作。
触发器示例:


sql
CREATE TRIGGER SyncHRInfo
ON HR
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    IF EXISTS (SELECT * FROM sys.servers WHERE name = 'LinkedServerName')
    BEGIN
        -- INSERT INTO mes1.dbo.HR (ColumnName1, ColumnName2, ...)
        -- SELECT ColumnName1, ColumnName2, ...
        -- FROM inserted
        -- WHERE (Condition)

        -- UPDATE mes1.dbo.HR
        -- SET ColumnName1 = inserted.ColumnName1, ColumnName2 = inserted.ColumnName2, ...
        -- FROM inserted
        -- WHERE (Condition)

        -- DELETE FROM mes1.dbo.HR
        -- FROM deleted
        -- WHERE (Condition)
    END
END

请将 "LinkedServerName" 替换为你在步骤 1 中创建的 Linked Server 的名称。根据你的需求,取消注释你需要的 INSERT、UPDATE 或 DELETE 语句,并根据相关字段和条件进行相应编辑。

注意:触发器会导致跨服务器的执行开销,请确保网络连接可靠,并考虑性能和数据一致性的因素。

希望这些信息对你有所帮助!如果你仍然遇到错误或有进一步的问题,请提供详细的错误消息和相关代码,以便我能给出更准确的建议。

SQL Server: 不同服务器之间的数据同步
可以参考这个例子


SQL Server 跨服务器同步数据方法_优游的鱼的博客-CSDN博客 SQL Server 跨服务器同步数据可以使用以下方法:使用复制功能:可以在源数据库上设置发布器,然后在目标数据库上设置订阅器,从而实现跨服务器的数据同步。此方法可支持单向或双向同步,也可支持实时或定期同步。使用SSIS数据工具包:可以使用SQL Server Integration Services (SSIS) 数据工具包中的任务和转换来复制和转换数据。使用SSIS可实现高度自定义和灵..._sqlserver数据双向同步 https://blog.csdn.net/weixin_35752233/article/details/129455192

采用chatgpt:
要在两个不同的服务器之间同步数据,可以使用SQL Server Linked Server 功能。Linked Server允许你在一个数据库服务器上访问另一个数据库服务器的数据。以下是如何设置并编写SQL语句来实现此同步的步骤:

1、在 10.1 服务器上设置 Linked Server 到 10.3 服务器:
在 10.1 服务器上打开 SQL Server Management Studio,导航到服务器对象 -> 右键点击 Linked Servers -> 选择 "New Linked Server"。

2、配置 Linked Server:

General Page: 输入 Linked Server 名称(例如:SERVER103),选择 “SQL Server” 作为服务器类型。
Security Page: 选择用于连接到 10.3 服务器的登录凭据。
3、编写 SQL 同步语句:
在 10.1 服务器上,编写一个 SQL 语句从 10.1 的 HR 表获取数据,并插入到 10.3 的 HR 表中。

INSERT INTO SERVER103.mes1.dbo.HR (入职时间, 姓名, 部门)
SELECT 入职时间, 姓名, 部门
FROM mes.dbo.HR
WHERE 入职时间 >= '2023-07-20 00:00:00' AND 入职时间 < '2023-07-20 12:00:00'

这将会把 10.1 服务器上今天上午的 HR 数据同步到 10.3 服务器的 HR 表中。

INSERT INTO SERVER103.mes1.dbo.HR (入职时间, 姓名, 部门)
SELECT 入职时间, 姓名, 部门
FROM mes.dbo.HR
WHERE 入职时间 >= '2023-07-20 12:00:00' AND 入职时间 < '2023-07-21 00:00:00'

这将会把 10.1 服务器上今天下午的 HR 数据同步到 10.3 服务器的 HR 表中。

注意事项:

请确保两个服务器之间可以相互访问,并且连接设置正确。
在实际应用中,可以将这些 SQL 语句包装在存储过程或者定时任务中,以便每天自动同步数据。同时,可以根据实际需求调整同步的时间段。

引用chatgpt

你可以使用以下 SQL 语句在 10.1 服务器上创建一个触发器,在每天的两个时间段同步 HR 表的数据到 10.3 服务器的 HR 表中:

-- 创建触发器
CREATE TRIGGER sync_hr_data
AFTER INSERT ON HR
FOR EACH ROW
BEGIN
    -- 判断当前时间是否在指定的两个时间段内(假设时间段为 9:00-12:00 和 14:00-17:00)
    IF (TIME_FORMAT(CURTIME(), '%H:%i') >= '09:00' AND TIME_FORMAT(CURTIME(), '%H:%i') <= '12:00') OR (TIME_FORMAT(CURTIME(), '%H:%i') >= '14:00' AND TIME_FORMAT(CURTIME(), '%H:%i') <= '17:00') THEN
        -- 向 10.3 服务器的 MES1 数据库的 HR 表插入数据
        INSERT INTO mes1.HR (入职时间, 姓名, 部门)
        VALUES (NEW.入职时间, NEW.姓名, NEW.部门);
    END IF;
END;


上述 SQL 语句创建了一个触发器 sync_hr_data,当在 10.1 服务器的 HR 表中插入新数据时,会触发该触发器。触发器中会判断当前时间是否在指定的两个时间段内,如果是,则将新数据插入到 10.3 服务器的 MES1 数据库的 HR 表中。

请注意,上述 SQL 语句中的时间段判断条件 09:00、12:00、14:00 和 17:00 是示例值,你需要根据实际需求进行相应的修改。