Несовместимые столбцы и операция слияния - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица со столбцами:

CREATE TABLE Tip
(
    ID int CONSTRAINT PK_Tip_ID PRIMARY KEY IDENTITY,
    Title varchar(100) NOT NULL,
    Description varchar(255) NOT NULL,
    Status varchar(10) NOT NULL,
    Created date DEFAULT GETDATE(),
    Expiration date,
    Published date NOT NULL,
    Link varchar(255),
    Category varchar(50) CONSTRAINT FK_Category FOREIGN KEY REFERENCES TipCategory(Name),
    Photo int CONSTRAINT FK_Photo FOREIGN KEY REFERENCES TipPhoto(ID),
    Highlighted bit CONSTRAINT DF_Highlighted DEFAULT 0
);

Я хочу создать процедуру и использовать операцию MERGE для выполнения операций INSERT и UPDATE над таблицей в одном операторе, но у меня есть одна проблема. Что если все столбцы (кроме идентификатора, конечно) несовместимы? Я имею в виду, что если я захочу изменить все отдельные столбцы со стороны переднего конца и отправить их в эту процедуру? Если у меня нет хотя бы одного столбца с данными, то как мне найти совпадение, как показано ниже:

MERGE Production.UnitMeasure AS target  
USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)  
ON (target.UnitMeasureCode = source.UnitMeasureCode)  
WHEN MATCHED THEN
    UPDATE SET Name = source.Name  
WHEN NOT MATCHED THEN  
    INSERT (UnitMeasureCode, Name)  
    VALUES (source.UnitMeasureCode, source.Name)

У меня нет постоянного столбца, чтобы решить, следует ли вводить или обновлять эти значения.

1 Ответ

0 голосов
/ 18 марта 2020

Я решил сделать вставку или обновить, зависит от идентификатора, как показано ниже:

CREATE PROCEDURE createEditTip
@ID int = NULL,
@Title varchar(100),
@Description varchar(255),
@Status varchar(10),
@Expiration date = NULL,
@Published date,
@Link varchar(255),
@Category varchar(50),
@PhotoID int,
@Highlighted bit

AS
BEGIN

    MERGE Tip AS target  
    USING (SELECT @ID, @Title, @Description, @Status, @Expiration, @Published, @Link, @Category, @PhotoID, @Highlighted) 
    AS source (ID, Title, Description, Status, Expiration, Published, Link, Category, PhotoID, Highlighted)  
    ON (target.ID = source.ID)  
    WHEN MATCHED THEN
        UPDATE SET Title = source.Title,
                   Description = source.Description,
                   Status = source.Status,
                   Expiration = source.Expiration,
                   Published = source.Published,
                   Link = source.Link,
                   Category = source.Category,
                   Photo = source.PhotoID,
                   Highlighted = source.Highlighted
    WHEN NOT MATCHED THEN  
        INSERT (Title, Description, Status, Expiration, Published, Link, Category, Photo, Highlighted)  
        VALUES (source.Title, source.Description, source.Status, source.Expiration, source.Published, source.Link, source.Category, source.PhotoID, source.Highlighted);

    IF NOT EXISTS (select 1 from TipCategory where Name = @Category)
    BEGIN
        insert into TipCategory
        values (@Category);
    END
END

Я думаю, что это тихое хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...