代码之家  ›  专栏  ›  技术社区  ›  SkyeBoniwell

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

  •  0
  • SkyeBoniwell  · 技术社区  · 4 年前

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

    • 声明并设置一个名为 @galaxyID
    • 然后用这个 galaxyObjects 有特殊的 galaxyID

    @galaxy 不为null,因为有时表中的列为null astroList

    我没有任何错误,但没有被删除,我不知道为什么。

    代码如下:

    DECLARE @galaxyID UNIQUEIDENTIFIER
    
    SET @galaxyID = (SELECT galaxyID FROM astroList WHERE astroID = @astroID)
    
    DELETE FROM galaxyObjects 
    WHERE galaxyID = @galaxyID AND @galaxyID IS NOT NULL
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Aaron Bertrand    4 年前

    你不能 真正地 使用 SET @var = (SELECT ...) 除非有 对于 SELECT 返回多行。因此,任何一个不了解数据模型的人看到这段代码都会认为这是一颗定时炸弹。在SQLServer中,更安全的选择是使用 DELETE 使用联接(适用于任意数量的行,不匹配时为no-op):

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

    这将忽略其中的行 galaxyID 在里面 astroList 为空。