IF @@ ROWCOUNT = 0, вызывается только один раз, кажется, не работает - PullRequest
0 голосов
/ 06 сентября 2018

Я использую 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

Этот запрос всегда не возвращает строк, если совпадений нет.

Ожидаемое поведение для совпадения (это происходит правильно)

  1. Запустите запрос, найдите запись. SET CREATED для FALSE и NEWID для соответствующего DIVISIONID.
  2. @@ ROWCOUNT = 1, поэтому пропустите вставку.

В противном случае ожидаемое поведение будет

  1. Запустите запрос, не найдете подходящей записи.
  2. @@ ROWCOUNT = 0? Так что выполняйте INSERT инди если IF
  3. Установите 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, это полные запросы. На столе нет триггеров или внешних индексов.

...