问题描述
在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;
这将忽略galaxyID
中astroList
为NULL的行。