Following is new data type that I created.
CREATE TYPE [dbo].[UpdateHotelTableType] AS TABLE(
[ID] [int] NULL,
[HotelID] [int] NULL,
[FromDate] [date
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
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.