Я использую SQL Server 2016 (Express)
Я использовал такой запрос, чтобы решить, вставлять или находить запись, основываясь на том, существует ли уже идентичная запись.
IF EXISTS (SELECT 1 FROM Divisions WHERE Title = '$Title')
BEGIN
SELECT NEWID = DIVISIONID, CREATED = 'FALSE' FROM Divisions WHERE Title = '$Title'
END
ELSE
BEGIN
INSERT INTO DIVISIONS(Title)
VALUES('$Title')
SELECT CREATED = 'True", NEWID = SCOPE_IDENTIY()
END
Условие WHERE из оператора EXISTS было повторено при первом выборе, дополнительной работе, дополнительном обслуживании и выполнении одного и того же сканирования дважды.
Я думал, что смогу изменить это на это. Я пытаюсь понять, ПОЧЕМУ этот запрос не работает.
SELECT NEWID = DivisionID, CREATED = 'False'
FROM Divisions D2
WHERE Title = '$Title'
IF (@@ROWCOUNT = 0)
BEGIN
INSERT INTO Divisions (Title)
VALUES('$Title')
SELECT NEWID = SCOPE_IDENTITY(), CREATED = 'TRUE'
END
Этот запрос всегда не возвращает строк, если совпадений нет.
Ожидаемое поведение для совпадения (это происходит правильно)
- Запустите запрос, найдите запись. SET CREATED для FALSE и NEWID для соответствующего DIVISIONID.
- @@ ROWCOUNT = 1, поэтому пропустите вставку.
В противном случае ожидаемое поведение будет
- Запустите запрос, не найдете подходящей записи.
- @@ ROWCOUNT = 0? Так что выполняйте INSERT инди если IF
- Установите NEWID в SCOPE_IDENTITY () и CREATED в TRUE, верните их.
Но этот похожий код работает.
DECLARE @OBJECTID INT = 0
SELECT @OBJECTID = DivisionID
FROM Divisions D2
WHERE Title = '$Title'
IF (ISNULL(@OBJECTID,0) = 0)
BEGIN
INSERT INTO Divisions (Title)
VALUES('$Title')
SELECT NEWID = SCOPE_IDENTITY(), CREATED = 'TRUE'
END
ELSE
BEGIN
SELECT NEWID = @OBJECTID, CREATED = 'FALSE'
END
Помимо упрощения инструкции INSERT и условий WHERE, это полные запросы. На столе нет триггеров или внешних индексов.