Insert and Update in SQL Using User-Defined Table Type

后端 未结 2 1479
悲&欢浪女
悲&欢浪女 2021-02-08 09:05

Following is new data type that I created.

CREATE TYPE [dbo].[UpdateHotelTableType] AS TABLE(
    [ID] [int] NULL,
    [HotelID] [int] NULL,
    [FromDate] [date         


        
相关标签:
2条回答
  • 2021-02-08 09:25

    You can Simply do 2 Queries: 1. "Update" command 2. "Insert" command.

    ALTER PROCEDURE [dbo].[SP_Hotel_Info_Update]
         -- Add the parameters for the stored procedure here
        @XHotelInfoDetails UpdateHotelTableType READONLY,
    
    AS
    BEGIN
    
        UPDATE dbo.HotelInfo
        SET FromDate = r.FromDate,
        FROM dbo.HotelInfo 
        JOIN @XHotelInfoDetails X ON X.Id = HotelInfo.Id
    
        INSERT INTO dbo.HotelInfo (Col1,Col2)
        SELECT X.Col1,
               X.Col2
        FROM @XHotelInfoDetails X
        WHERE NOT EXISTS
                       (
                         SELECT 1
                         FROM dbo.HotelInfo InnerTable
                         WHERE X.Id = InnerTable.Id
                       )
    
    END
    
    0 讨论(0)
  • 2021-02-08 09:49

    Use MERGE:

    Performs insert, update, or delete operations on a target table based on the results of a join with a source table. For example, you can synchronize two tables by inserting, updating, or deleting rows in one table based on differences found in the other table.

    ALTER PROCEDURE [dbo].[SP_Hotel_Info_Update]
         -- Add the parameters for the stored procedure here
        @XHotelInfoDetails UpdateHotelTableType READONLY,
    
    AS
    BEGIN
    
        MERGE dbo.HotelInfo AS trg
        USING @XHotelInfoDetails AS src
          ON src.ID = trg.ID
         WHEN MATCHED THEN
           UPDATE SET FromDate = src.FromDate
         WHEN NOT MATCHED BY TARGET THEN
           INSERT (col1, col2, ...)
           VALUES (src.col1, src.col2, ...);
    END
    

    EDIT:

    In my datatable, there can be newly added rows as well as deleted rows. So how can I compare the id and delete rows from hotelinfo table?

    You could add new clause:

    WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]  
         THEN DELETE;
    

    with specific condition to delete data from target.

    0 讨论(0)
提交回复
热议问题