首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql server中插入父记录的正确详细信息

在sql server中插入父记录的正确详细信息
EN

Stack Overflow用户
提问于 2021-05-28 15:22:01
回答 3查看 205关注 0票数 1

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

主表

代码语言:javascript
复制
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')

外型表

代码语言:javascript
复制
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.')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-01 11:56:35

“我正在对外键进行硬编码,并假定它将按顺序执行,并且会很好。”

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

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

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2021-06-07 22:38:53

对id值进行硬编码似乎很危险。假设模式存在并且表是这样的.

代码语言:javascript
复制
create table OnScreenText (
  OnScreenTextId int identity(1,1) not null,
  applicationcode varchar(50),
  OnScreenTextCode varchar(128)
)

create table multilingual.OnScreenTextTranslation (
  OnScreenTextId int not null,
  LanguageCode varchar(50) not null,
  DefaultLanguage int not null,
  OnScreenTextValue varchar(1000)
)

...this应该能工作..。

代码语言:javascript
复制
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)
select ost.OnScreenTextId, 'en-GB', 1, 'Full legal name'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.FULL_LEGAL_NAME'

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
select ost.OnScreenTextId, 'fr-FR', 0, 'Nom légal complet'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.FULL_LEGAL_NAME'

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
select ost.OnScreenTextId, 'en-GB', 1, 'Company registration number'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.COMPANY_REGISTRATION_NUMBER'

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
select ost.OnScreenTextId, 'fr-FR', 0, 'Numéro d''entreprise'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.COMPANY_REGISTRATION_NUMBER'

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
select ost.OnScreenTextId, 'en-GB', 1, 'To update your full legal name or company registration number please contact your Anglo American Relationship Manager'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.TEXT'

insert into multilingual.OnScreenTextTranslation (OnScreenTextId,LanguageCode,DefaultLanguage,OnScreenTextValue)
select ost.OnScreenTextId, '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.'
from multilingual.OnScreenText ost
where ost.OnScreenTextCode = 'DETAILS.COMPANY_INFORMATION.TEXT'
;

select *
from multilingual.OnScreenText
;

select *
from multilingual.OnScreenTextTranslation
;
票数 0
EN

Stack Overflow用户

发布于 2021-05-28 15:34:17

这可以在使用CTE的postgres中完成,但遗憾的是,sql server不支持这一点。除此之外,您可以做的是将整个事件作为一个事务运行,并且只有在执行检查之后,才能执行以下检查:在sequence

  • Start表的数据中,OnScreenText中的最后一个id正好比OnScreenTextId的第一个值少一个。

  • 汇总<代码>G19<代码>H 110确保子记录和父记录在预期的中,这是当前的OnScreenTextTranslation表的最后一个值(基本上是max/最新id)。父表的id列
  • if(来自3 ==的值(从子插入语句的第1条记录到parentId的值) -1 )
    • 执行==

代码语言:javascript
复制
1. else rollback
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67741608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档