首页 > 解决方案 > 在 sql server 中为父记录插入正确的详细信息

问题描述

我正在编写要在 SQL Server 上执行的以下脚本。我需要确保正确的外键记录映射到父表。如果您在下面看到我正在硬编码外键并假设它会按顺序执行并且会很好。我有大约 100 多条记录要插入。我需要知道在插入详细记录之前有办法检查正确的父 ID。

主表

insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode)
values ('MASTERDATA','DETAILS.COMPANY_INFORMATION.FULL_LEGAL_NAME')
insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode)
values ('MASTERDATA','DETAILS.COMPANY_INFORMATION.COMPANY_REGISTRATION_NUMBER')
insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode)
values ('MASTERDATA','DETAILS.COMPANY_INFORMATION.TEXT')

国外表

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (1,'en-GB', 1,'Full legal name')
insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (1,'fr-FR',0,'Nom légal complet')

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (2,'en-GB', 1,'Company registration number')
insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (2,'fr-FR',0,'Numéro d''entreprise')

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (3,'en-GB', 1,'To update your full legal name or company registration number please contact your Anglo American Relationship Manager')
insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
values (3,'fr-FR',0,'Pour mettre à jour votre nom légal complet ou le numéro d''enregistrement de votre société, veuillez contacter votre responsable des relations avec Anglo American.')

标签: sqlsql-server

解决方案


“我正在硬编码外键并假设它会按顺序执行并且会很好。”

一个好的方法假设什么。在这种情况下,未提供表的 DDL,但似乎“multilingual.OnScreenText”表具有 IDENTITY 属性的整数主键。如果是这样,则可以使用 SCOPE_IDENTITY() 函数访问插入的标识值。

请求是一个脚本。以下设置 NO COUNT ON(以减少消息传递)并设置 XACT_ABORT ON 以确保任何事务回滚适用于所有 DML 语句。在每次 INSERT 到 'multilingual.OnScreenText' 之后,脚本会测试以确保实际插入了一行 (@@rowcount>0)。如果插入了一行,则生成的标识值将分配给@id 变量,并在随后的 INSERT 中使用到“multilingual.OnScreenTextTranslation”表。像这样的东西

set nocount on;
set xact_abort on;

begin transaction
    declare @id         int;

    insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode) values
    ('MASTERDATA','DETAILS.COMPANY_INFORMATION.FULL_LEGAL_NAME');
    if @@rowcount>0
        begin
            select @id=cast(scope_identity() as int);

            insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue) values
            (@id,'en-GB', 1,'Full legal name'),
            (@id,'fr-FR',0,'Nom légal complet');
        end

    insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode) values
    ('MASTERDATA','DETAILS.COMPANY_INFORMATION.COMPANY_REGISTRATION_NUMBER');
    if @@rowcount>0
        begin
            select @id=cast(scope_identity() as int);

            insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue) values
            (@id,'en-GB', 1,'Company registration number'),
            (@id,'fr-FR',0,'Numéro d''entreprise');
        end

    insert into multilingual.OnScreenText (applicationcode,OnScreenTextCode) values
    ('MASTERDATA','DETAILS.COMPANY_INFORMATION.TEXT');
    if @@rowcount>0
        begin
            select @id=cast(scope_identity() as int);

            insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue) values
            (@id,'en-GB', 1,'To update your full legal name or company registration number please contact your Anglo American Relationship Manager'),
            (@id,'fr-FR',0,'Pour mettre à jour votre nom légal complet ou le numéro d''enregistrement de votre société, veuillez contacter votre responsable des relations avec Anglo American.');
        end
commit;

推荐阅读