我正在编写要在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.')发布于 2021-06-01 11:56:35
“我正在对外键进行硬编码,并假定它将按顺序执行,并且会很好。”
一种好的方法没有任何假设。在这种情况下,没有提供表的DDL,但“multilingual.OnScreenText”表似乎有一个带有IDENTITY属性的整数主键。如果是,则可以使用SCOPE_IDENTITY()函数访问插入的标识值。
这个请求是为了一个脚本。以下设置不依赖于(以减少消息传递),并设置XACT_ABORT以确保任何事务回滚都适用于所有DML语句。每次插入“multilingual.OnScreenText”后,脚本将测试以确保实际插入了一行(@@rowcount>0)。如果插入了一行,则将生成的标识值分配给@id变量,并在随后插入“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;发布于 2021-06-07 22:38:53
对id值进行硬编码似乎很危险。假设模式存在并且表是这样的.
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应该能工作..。
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
;发布于 2021-05-28 15:34:17
这可以在使用CTE的postgres中完成,但遗憾的是,sql server不支持这一点。除此之外,您可以做的是将整个事件作为一个事务运行,并且只有在执行检查之后,才能执行以下检查:在sequence
OnScreenText中的最后一个id正好比OnScreenTextId的第一个值少一个。
OnScreenTextTranslation表的最后一个值(基本上是max/最新id)。父表的id列1. else rollbackhttps://stackoverflow.com/questions/67741608
复制相似问题