До 2008 года подход, который вы используете, в значительной степени присутствует. В SQL Server нет «Upsert», который позаботится о вас, поэтому вы должны проверить себя.
До 2008 г. - общий
IF EXISTS(SELECT [PrimaryKey] FROM [MyTable] WHERE [PrimaryKey] = @PassedInID)
BEGIN
UPDATE [MyTable]
SET [Field1] = @PassedInValue1,
[Field2] = @PassedInValue2
WHERE [PrimaryKey] = @PassedInID
END
ELSE
BEGIN
INSERT INTO [MyTable] ([PrimaryKey], [Field1], [Field2])
VALUES (@PassedInID, @PassedInValue1, @PassedInValue2)
END
Если вы делаете много обновлений и вызываете это много раз, либо передайте первичный ключ, либо индексируйте передаваемое вами значение. Это избавит SQL Server от загрузки данных таблицы, чтобы узнать, является ли обновление вставки необходимо.
Однако, если вы вызываете его много раз, было бы лучше передать таблицу всех вставок / обновлений и JOIN
в существующую таблицу дважды и просто выполнить одну INSERT
и одну UPDATE
2008 и позже - Sepcific
С 2008 года и позже вы можете использовать MERGE
(Спасибо за @Shawn за то, что он указал, что это был старый)
MERGE INTO [Accounts] AS target
USING (SELECT @AccountID) AS source ([AccountID])
ON (target.[Email] = source.Email AND target.[Username] = @Username)
WHEN MATCHED THEN
UPDATE SET [FirstName] = @FirstName
, [LastName] = @LastName
, [Middle] = @Middle
, [Email] = @Email
, [Username] = @Username
WHEN NOT MATCHED THEN
INSERT ([AccountID], [FirstName], [LastName], [Middle], [Email], [Username])
VALUES (@AccountID, @FirstName, @LastName, @Middle, @Email, @Username)
Все-в-один
Если вам нужно проверить электронную почту и имя пользователя одновременно, вы можете смешать IF NOT EXISTS
и MERGE
IF NOT EXISTS(SELECT [PrimaryKey] FROM [MyTable] WHERE [Email] = @Email OR [Username] = @Username)
BEGIN
MERGE INTO [Accounts] AS target
USING (SELECT @AccountID) AS source ([AccountID])
ON (target.[Email] = source.Email AND target.[Username] = @Username)
WHEN MATCHED THEN
UPDATE SET [FirstName] = @FirstName
, [LastName] = @LastName
, [Middle] = @Middle
, [Email] = @Email
, [Username] = @Username
WHEN NOT MATCHED THEN
INSERT ([AccountID], [FirstName], [LastName], [Middle], [Email], [Username])
VALUES (@AccountID, @FirstName, @LastName, @Middle, @Email, @Username)
END