1 year ago

#76752

test-img

Beweelam

SQL Server Merge statement issues

I have 3 tables like this:

CREATE TABLE VersionsProjects
(
    IdVersionProject INT IDENTITY(1,1) PRIMARY KEY,
    Version INT
);

CREATE TABLE Parameters 
(
    IdParameter INT IDENTITY(1,1) PRIMARY KEY,
    IdVersionProject INT,
    Name VARCHAR(50),
    FOREIGN KEY (IdVersionProject) REFERENCES VersionsProjects(IdVersionProject)
);

CREATE TABLE Questions 
(
    IdQuestion INT IDENTITY(1,1) PRIMARY KEY,
    Text VARCHAR(50),
    IdParameter INT,
    FOREIGN KEY (IdParameter) REFERENCES Parameters(IdParameter)
);

When I create a new insert in VersionsProjects, I duplicate all the rows in parameters related to old versionsProjects and duplicate all the rows in questions related to duplicate parameters.

Example :

DECLARE @TempParametersDuplicated TABLE (Old_ID_Parameter INT, New_ID_Parameter INT)

MERGE INTO Parameters T1
USING (SELECT IdParameter, Name
       FROM Parameters P
       WHERE IdVersionProject = @OldIdVersionProject) T2 ON 1 = 0

WHEN NOT MATCHED 
    THEN
        INSERT (Name, IdVersionProject)
        VALUES (T2.Name, @NewIdVersionProject)
        OUTPUT T2.IdParameter, INSERTED.IdParameter INTO TempParametersDuplicated;

MERGE INTO Parameters T1
USING (SELECT Text, T.New_ID as IdParameter
       FROM Questions Q
       INNER JOIN @TempParametersDuplicated T ON Q.IdParameter = T.Old_ID
       WHERE IdVersionProject = @OldIdVersionProject) T2 ON 1 = 0

WHEN NOT MATCHED 
    THEN
        INSERT (Text, IdParameter)
        VALUES (T2.Text, T2.IdParameter);

My first question: is the method I'm using the best? Or is there a cleaner way to do the same thing ?

My second question: I heard that the merge command is really unreliable. Should I be worried about it? Sometime, I have more than 300k rows to insert.

sql

sql-server

merge

insert

0 Answers

Your Answer

Accepted video resources