Ваша проблема в том, что вы на самом деле не вызываете UPDATE, а INSERT, который пытается создать дубликат ключа.
Это потому, что вы проверяете, существует ли строка для значений первичного ключа И ИД продукта. Когда вы пытаетесь изменить ту же строку на другой идентификатор продукта, тогда ваш чек возвращает false.
Я немного изменил ваш код, поэтому вы проверяете текущий идентификатор продукта только для значений первичного ключа, только вставляя его, когда его нет, и обновляя его, только если он другой.
CREATE TABLE dbo.TestData
(
OgrId int NOT NULL,
StrId int NOT NULL,
UserId int NOT NULL,
ProductId int NOT NULL,
CONSTRAINT PK_OgrId_StrId_UserId
PRIMARY KEY(OgrId, StrId, UserId)
)
DECLARE @ogrId int = 99;
DECLARE @strId int = 44;
DECLARE @userId int = 1223;
DECLARE @id int = 14;
DECLARE @querySelect int =
(SELECT ProductId FROM dbo.TestData
WHERE
OgrId = @ogrId AND
StrId = @strId AND
UserId = @userId);
IF @querySelect IS NULL
BEGIN
INSERT INTO dbo.TestData(OgrId, StrId, UserId, ProductId)
VALUES (@ogrId , @strId , @userId, @id);
END
ELSE IF @querySelect <> @id
BEGIN
UPDATE dbo.TestData
SET ProductId= @id
WHERE
OgrId = @ogrId AND
StrId = @strId AND
UserId = @userId;
END