存储过程在调用时从不删除行

问题描述

在SQL Server 2012存储过程中,我具有以下代码行:

  • 声明并设置一个名为@galaxyID的变量
  • 然后使用该@galaxyID从名为galaxyObjects的表中删除具有特定galaxyID的所有行

我需要检查以确保@galaxy不为null,因为有时表astroList中的列为NULL。

我没有任何错误,但是什么也没有删除,我不确定为什么。

代码如下:

DECLARE @galaxyID UNIQUEIDENTIFIER

SET @galaxyID = (SELECT galaxyID FROM astroList WHERE astroID = @astroID)

DELETE FROM galaxyObjects 
WHERE galaxyID = @galaxyID AND @galaxyID IS NOT NULL

解决方法

除非不可能 SET @var = (SELECT ...)返回多行,否则您不能真的使用SELECT。因此,任何查看此代码但不知道数据模型的人都将认为这是一个定时炸弹。 SQL Server中一个更安全的选择是将DELETE与连接一起使用(该连接可用于任意数量的行,并且在没有匹配项时是无操作的):

DELETE go
  FROM dbo.astroList AS al
  INNER JOIN dbo.galaxyObjects AS go
  ON al.galaxyID = go.galaxyID
  WHERE al.astroID = @astroID;

这将忽略galaxyIDastroList为NULL的行。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...