Sql 更新引用新表数据的多表
我有一个名为Sql 更新引用新表数据的多表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个名为ADSCHL的表,其中包含school\u code作为主键 以及其他两个表,如RGDEGR(公共字段为SCHOOl\u code)和RGENRl(原始SCHOOl\u code),它们引用了ADSCHL 如果将更新school\u代码,则表RGDEGR(school\u代码)和RGERNL(原始学校代码)也必须更新 我得到了一个新数据,该数据已使用SSI导入SQL server,表名为TESTCEP,其中有一个列名school\u code。我被分配了一项任务,用新的学校代码(TE
ADSCHL
的表,其中包含school\u code
作为主键
以及其他两个表,如RGDEGR
(公共字段为SCHOOl\u code
)和RGENRl(原始SCHOOl\u code
),它们引用了ADSCHL
如果将更新school\u代码
,则表RGDEGR(school\u代码)
和RGERNL(原始学校代码)
也必须更新
我得到了一个新数据,该数据已使用SSI导入SQL server,表名为TESTCEP
,其中有一个列名school\u code
。我被分配了一项任务,用新的学校代码(TESTCEP
)更新旧的学校代码(ADSCHL
)值(ADSCHL
),并确保所有3个表都发生了更改
有人能帮我吗
我试着使用合并更新
功能,但没有成功。它出错了
我尝试使用此查询,但不确定这是否有助于我更新所有表:
UPDATE dbo.ADSCHL
SET dbo.ADSCHL.SCHOOL_CODE = FD.SCHOOL_Code
FROM dbo.ADSCHL AD
INNER JOIN TESTCEP FD
ON AD.SCHOOL_NAME = FD.School_Name
据我所知,在一条语句中不能更新多个表。但是,您可以在更新dbo.ADSCHL
之前编写一个instead of update触发器来更新其他两个表,如下所示:
更新触发器之前:
CREATE TRIGGER dbo.UpdateSchoolCode ON dbo.ADSCHL
INSTEAD OF UPDATE
AS
BEGIN
--update RGDEGR
UPDATE rd
SET rd.school_code = i.school_code
FROM RGDEGR rd
INNER JOIN deleted d ON d.school_code = rd.school_code
INNER JOIN inserted i ON i.id = d.id; --primary key join
--update RGENRl
UPDATE rg
SET rg.school_code = i.school_code
FROM RGENRl rg
INNER JOIN deleted d ON d.school_code = rg.school_code
INNER JOIN inserted i ON i.id = d.id; --primary key join
END;
然后在创建触发器后运行此update语句:
--update ADSCHL
UPDATE ad
SET ad.SCHOOL_CODE = fd.SCHOOL_Code
FROM dbo.ADSCHL ad
INNER JOIN TESTCEP fd ON ad.SCHOOL_NAME = fd.School_Name;
注意:对于我上面的评论,我很抱歉,我刚刚意识到您需要的是更新前触发器而不是更新后触发器。据我所知,您不能在一条语句中更新多个表。但是,您可以在更新dbo.ADSCHL
之前编写一个instead of update触发器来更新其他两个表,如下所示:
更新触发器之前:
CREATE TRIGGER dbo.UpdateSchoolCode ON dbo.ADSCHL
INSTEAD OF UPDATE
AS
BEGIN
--update RGDEGR
UPDATE rd
SET rd.school_code = i.school_code
FROM RGDEGR rd
INNER JOIN deleted d ON d.school_code = rd.school_code
INNER JOIN inserted i ON i.id = d.id; --primary key join
--update RGENRl
UPDATE rg
SET rg.school_code = i.school_code
FROM RGENRl rg
INNER JOIN deleted d ON d.school_code = rg.school_code
INNER JOIN inserted i ON i.id = d.id; --primary key join
END;
然后在创建触发器后运行此update语句:
--update ADSCHL
UPDATE ad
SET ad.SCHOOL_CODE = fd.SCHOOL_Code
FROM dbo.ADSCHL ad
INNER JOIN TESTCEP fd ON ad.SCHOOL_NAME = fd.School_Name;
注意:我为我的上述评论道歉,我刚刚意识到你需要一个更新前的触发器而不是更新后的触发器。你能把你的代码和错误一起发布吗?更新dbo.ADSCHL SET dbo.ADSCHL.SCHOOL\u code=FD.SCHOOL\u code FROM dbo.ADSCHL AD internal JOIN TESTCEP FD ON AD.SCHOOL\u NAME=FD.SCHOOL\u NAME我尝试过使用上面的查询,但不确定这是否对我有帮助更新所有的表。我对SQL非常陌生,因此非常感谢您的帮助。据我所知,在SQL Server中,您不能在一条语句中更新多个表。您可能需要创建更新后触发器。因此,一旦在表dbo.ADSCHL
中更新了值,它会更新其他两个表中的school\u code
值。你能告诉我这是如何工作的吗..或者只是用基本的SQL查询指导我..你能把你的代码和错误一起发布吗?更新dbo.ADSCHL SET dbo.ADSCHL.school\u code=FD.school\u code FROM dbo.ADSCHL AD内部连接测试cep FD ON AD.school\u NAME=FD.school\u NAME我尝试使用上面的查询,我不确定这是否能帮助我更新所有的表。我对SQL非常陌生,因此非常感谢您的帮助。据我所知,在SQL Server中,您不能在一条语句中更新多个表。您可能需要创建更新后触发器。因此,一旦表dbo.ADSCHL
中的值被更新,它就会更新其他两个表中的school\u code
值。您能告诉我这是如何工作的吗..或者只是用基本的SQL查询指导我..嗨,我正在查看代码,我不确定我(插入)和删除(d)的内容引用?Inserted
和deleted
是将插入/删除的值存储在与基础表相同的表结构中的伪表(在您的示例中是dbo.ADSCHL
)。下面是关于这些表的一个很好的解释:我尝试使用您提供的查询,第一部分执行成功,但当我尝试更新作为错误接收的ADSCHL时”(受影响的343行)(受影响的1422行)Msg 3902,16级,状态1,过程更新ChoolCode,第26行提交事务请求没有相应的BEGIN事务。语句已终止。“我从触发器中删除了提交部分(可选)。请再试一次,现在应该可以正常运行了。Msg 3609,16级,状态1,第1行事务在触发器中结束。批处理已中止。您好,我正在查看代码,我不确定我(insert)和delete(d)指的是什么?Inserted
和deleted
是伪表,它们将插入/删除的值存储在与基础表相同的表结构中(在您的情况下是dbo.ADSCHL
)。下面是关于这些表的一个很好的解释:我尝试使用您提供的查询,第一部分执行成功,但当我尝试更新作为错误接收的ADSCHL时”(受影响的343行)(受影响的1422行)Msg 3902,16级,状态1,过程更新ChoolCode,第26行提交事务请求没有相应的BEGIN事务。语句已终止。“我从触发器中删除了提交部分(可选)。请再试一次,现在应该可以正常运行了。Msg 3609,16级,状态1,第1行事务在触发器中结束。批处理已中止。