如果@@ ROWCOUNT = 0,仅被调用一次,则似乎不起作用

时间:2018-09-06 20:09:54

标签: sql-server sql-server-2016

我正在使用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

在第一次选择中重复了EXISTS语句中的WHERE条件,需要做更多的工作,需要维护更多,并且两次进行相同的扫描。


我认为我可以将其更改为此。 我试图了解为什么该查询不起作用。

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. 运行查询,找到记录。设置创建为FALSE,将NEWID设置为匹配的DIVISIONID。
  2. @@ ROWCOUNT = 1,所以跳过插入。

否则,预期的行为是

  1. 运行查询,找不到匹配的记录。
  2. @@ ROWCOUNT = 0?因此,在IF上执行INSERT独立操作
  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条件之外,这些都是完整的查询。表格上没有触发器或外来索引。

0 个答案:

没有答案