CREATE PROCEDURE [dbo].[USP_ChartsTemplate_AddOrUpdate] @client VARCHAR(100), @user VARCHAR(300), @chartName VARCHAR(300), @symbol VARCHAR(50), @resolution VARCHAR(10), @lastModified DATETIME, @content TEXT, @chartId BIGINT = NULL AS MERGE [ChartsTemplate] as ct USING (VALUES(@chartId, @client,@user, @chartName,@symbol,@resolution,@lastModified,@content)) as s ([ChartId], [Client], [User], [ChartName], [Symbol], [Resolution], [LastModified], [Content]) ON ct.[Id] = s.[ChartId] AND ct.[User] = s.[User] AND ct.[Client]=s.[Client] WHEN MATCHED THEN UPDATE SET [ChartName] = s.[ChartName], [Symbol] = s.[Symbol], [Resolution] = s.[Resolution], [LastModified] = s.[LastModified], --NEED REVIEW: possiblyu better fill from db like GETUTCDATE() [Content] = s.[Content] WHEN NOT MATCHED THEN INSERT ([Client], [User], [ChartName], [Symbol], [Resolution], [LastModified], [Content]) VALUES (@client, @user, @chartName, @symbol, @resolution, @lastModified, @content) ; SELECT SCOPE_IDENTITY() RETURN 0