【问题标题】:Create procedure that will insert or update data from one temporary table to other 4 tables创建将数据从一个临时表插入或更新到其他 4 个表的过程
【发布时间】:2018-06-26 02:41:02
【问题描述】:

我需要 创建将

  1. 将源表中的数据插入或更新到 target1 表中
  2. 向 target2 表中插入数据并获得插入的 ID 来自 target1、target2 表
  3. 将它们插入目标表3
  4. 将 target1.ID 插入到 target4 表中

源表是临时表,我使用批量复制将大数据插入到该表中,然后将数据移动到目标表以提高性能。

MSPCompanies - insert or update по признаку INN
MSPDownloads insert
MSPAccepted insert MSPCompanies.ID и MSPDownloads.ID
MSPAcceptedNow insert MSPCompanies.ID

在我使用 MERGE 完成的 MSPCompanies 中插入或更新

BEGIN
 BEGIN TRY
  BEGIN TRANSACTION
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

    -- Insert statements for procedure here
 MERGE INTO [MSPCompanies] AS [Target]
USING [MSPTempTable] AS [Source]
 ON Target.INN = Source.INN
WHEN MATCHED THEN
UPDATE SET 
 Target.Name = Source.Name,
 Target.ShortName = Source.ShortName,
 Target.FIO = Source.FIO,
 Target.SubjectType = Source.SubjectType,
 Target.SubjectCategory = Source.SubjectCategory,
 @MSPCompaniesId = Target.MSP_Companies_ID

WHEN NOT MATCHED THEN
INSERT 
 (INN, Name, ShortName, FIO, SubjectType, SubjectCategory) 
VALUES 
 (Source.INN, Source.Name, Source.ShortName, Source.FIO, Source.SubjectType, Source.SubjectCategory);

IF @MSPCompaniesId IS NULL
BEGIN
    SET @MSPCompaniesId = CAST(SCOPE_IDENTITY() as [int]);
END
SELECT @MSPCompaniesId
--BEGIN
INSERT INTO dbo.MSPAcceptedNow
(MSP_Company_ID)
VALUES(@MSPCompaniesId)

但是之后似乎无法对其他三个表进行其他操作,并尝试使用插入-更新进行操作,但无论如何都无法做到。

BEGIN TRANSACTION MoveDataFromMSPTempTableT; 
UPDATE t
    SET 
  Name = s.Name,
  ShortName = s.ShortName,
  FIO = s.FIO,
  SubjectType = s.SubjectType,
  SubjectCategory = s.SubjectCategory
    FROM MSPCompanies t
        JOIN MSPTempTable s
        ON s.INN = t.INN;

INSERT INTO MSPCompanies
        SELECT s.INN,
               s.Name,
      s.ShortName,
      s.FIO,
      s.SubjectType,
      s.SubjectCategory
            FROM MSPTempTable s
                LEFT JOIN MSPCompanies t
                ON s.INN = t.INN
            WHERE t.INN IS NULL;

COMMIT TRANSACTION MoveDataFromMSPTempTableT;

谢谢。

【问题讨论】:

    标签: sql-server database stored-procedures sqlbulkcopy


    【解决方案1】:

    您不能使用变量来跟踪所有更改,但您可以使用 OUTPUT 跟踪所有更改。

    if object_id('dbo.[MSPCompanies]') is not null drop table dbo.[MSPCompanies];
    if object_id('dbo.[MSPTempTable]') is not null drop table dbo.[MSPTempTable];
    
    create table dbo.[MSPTempTable]
    (
        MSP_Companies_ID    int identity(1,1),
        INN                 varchar(5) primary key clustered,
        [Name]              varchar(20),
        ShortName           varchar(20),
        FIO                 varchar(20),
        SubjectType         varchar(20),
        SubjectCategory     varchar(20)
    );
    
    insert into dbo.[MSPTempTable] (inn,
     [Name]         
    ,ShortName      
    ,FIO            
    ,SubjectType    
    ,SubjectCategory) values ('a','a','a','a','a','a'),     ('a2','a2','a2','a2','a2','a2');
    
    create table dbo.[MSPCompanies]
    (
        MSP_Companies_ID    int identity(1,1),
        INN                 varchar(5) primary key clustered,
        [Name]              varchar(20),
        ShortName           varchar(20),
        FIO                 varchar(20),
        SubjectType         varchar(20),
        SubjectCategory     varchar(20)
    );
    
    insert into dbo.[MSPCompanies] (inn,
     [Name]         
    ,ShortName      
    ,FIO            
    ,SubjectType    
    ,SubjectCategory) values ('a','a','a','a','a','a');
    
    begin tran
    set xact_abort on;
    
    SET NOCOUNT ON;
    
     DECLARE @SummaryOfChanges TABLE(
        CompanyID int,
        Change VARCHAR(20)
     ); 
    
    
     MERGE INTO [MSPCompanies] AS [Target]
        USING [MSPTempTable] AS [Source]
            ON Target.MSP_Companies_ID = Source.MSP_Companies_ID
        WHEN MATCHED THEN
            UPDATE SET 
                 Target.Name = Source.Name,
                 Target.ShortName = Source.ShortName,
                 Target.FIO = Source.FIO,
                 Target.SubjectType = Source.SubjectType,
                 Target.SubjectCategory = Source.SubjectCategory
        WHEN NOT MATCHED THEN
            INSERT  (INN, Name, ShortName, FIO, SubjectType, SubjectCategory) 
            VALUES  (Source.INN, Source.Name, Source.ShortName, Source.FIO,     Source.SubjectType, Source.SubjectCategory)
    
        OUTPUT inserted.MSP_Companies_ID, $action INTO @SummaryOfChanges;
    
    SELECT * from dbo.[MSPCompanies]
    SELECT * from @SummaryOfChanges;
    
    if @@TRANCOUNT > 0 
        rollback tran;
    

    【讨论】:

    • 不客气。如果您认为这是解决方案,您介意点击“接受此答案”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2021-12-13
    • 2022-01-24
    相关资源
    最近更新 更多