У меня есть таблица «INSERTIF», который выглядит следующим образом -Безопасный способ потока, чтобы проверить, существует ли строка перед вставкой. Правильно ли мой код?
id value
S1 s1rocks
S2 s2rocks
S3 s3rocks
Перед вставкой строки в эту таблицу, я хотел бы проверить, если данный идентификатор существует или нет. Если он не существует, тогда вставьте. Else, просто обновите значение. Я хочу сделать это безопасным потоком. Можете ли вы сказать, правильно ли мой код или нет? Я попробовал, и это сработало. Но я хочу быть уверенным, что у меня нет недостатка в производительности.
EDIT 1- Я хочу использовать этот код для вставки миллионов строк по одному. Каждый оператор insert обернут вокруг кода, который я показал.
EDIT 2 - Я не хочу использовать часть UPDATE моего кода, достаточно только вставки.
Я не хочу использовать MERGE, поскольку он работает только с SQL Server 2008 и выше
Спасибо.
код -
-- no check insert
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')
--insert with checking
begin tran /* default read committed isolation level is fine */
if not exists
(select * from INSERTIF with (updlock, rowlock, holdlock)
where ID = 'S1')
BEGIN
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')
END
else
/* update */
UPDATE INSERTIF
SET VALUE = 's1doesNOTrock'
WHERE ID = 'S1'
commit /* locks are released here */
код для создания таблицы -
CREATE TABLE [dbo].[INSERTIF](
[id] [varchar](50) NULL,
[value] [varchar](50) NULL
)
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S1', N's1rocks')
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S2', N's2rocks')
INSERT [dbo].[INSERTIF] ([id], [value]) VALUES (N'S3', N's3rocks')
@JonathanLeffler - см. Мое редактирование. Я НЕ хочу использовать MERGE. Я просто этого не делаю. – Steam
Выполнение этого для миллиона строк «по одному» является безумным. См. Http://stackoverflow.com/questions/12621241/can-i-use-the-merge-statement-in-sql-server-2005. Вставьте в таблицу temp и используйте принятый ответ. –
OK; SQL Server 2005 почти десятилетие назад; возможно, ваши пользователи должны обновлять до 6-летней версии? Зачем калечить ваши современные системы, чтобы вы все еще могли работать с архаичными? Заявление MERGE может дать вам прирост производительности по эффективности - особенно если код, который у вас есть, включает в себя удаление данных из СУБД клиенту и обратно. –