Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新引用新表数据的多表_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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行事务在触发器中结束。批处理已中止。