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

在插入SQL Server之前验证输入参数

  •  1
  • VinnyGuitara  · 技术社区  · 6 年前

    我有一个SQL Server存储过程,它接受一个XML参数并将值复制到一个临时表中。然后对这些值进行验证,以确保提交了所有必需的数据,并且如果数据不是“干净的”,则会采取措施。如果这些数据是好的,那么我继续处理一系列业务规则,并最终从临时表插入到多个表中。

    我的问题似乎很明显,但无论如何我都要问。在插入后续表时,通过直接从临时表中进行选择,使用存储在临时表中的值。是否需要再次验证这些值以确保没有空值?

    DECLARE @col1Val AS INT
    DECLARE @col2Val AS INT
    
    SET @col1Val = (SELECT column1 FROM #TempTable)
    SET @col2Val = (SELECT column2 FROM #TempTable)
    
    INSERT INTO Table (column1, column2)
    VALUES (@col1Val, @col2Val)
    

    VS:

    DECLARE @col1Val AS INT
    DECLARE @col2Val AS INT
    
    SET @col1Val = (SELECT column1 FROM #TempTable)
    SET @col2Val = (SELECT column2 FROM #TempTable)
    
    INSERT INTO Table (column1, column2)
    VALUES (ISNULL(@col1Val, 0), ISNULL(@col2Val, 0))
    

    插入前是否需要检查这些值是否为空?我假设公平地说,如果我已经验证了所有内容,那么在插入时再次验证它将是浪费。我已经做了空支票等。

    我不确定这个问题是否属于代码评审,如果是,请随意关闭它。

    此表中只有一行。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Ilyes    6 年前

    你可以简单地做

    INSERT INTO Table (column1, column2)
    SELECT ISNULL(Column1, 0),
           ISNULL(Column2, 0)
    FROM #TempTable;
    -- Where if there is conditions
    

    如果你想查一下 NULL s并替换为 0 相反,否则,您只需将数据作为

    INSERT INTO Table(Column1, Column2)
    SELECT Column1,
           Column2
    FROM #TempTable;
    -- Where if there is conditions
    

    不需要声明这些变量,而且这部分

    SET @col1Val = (SELECT column1 FROM #TempTable)
    SET @col2Val = (SELECT column2 FROM #TempTable)
    

    不是你想的那样,只有当你在 #TempTable ,如果此表有多行,则将引发错误

    子查询返回多个值。当子查询后接=,,则不允许这样做!=、<、<=、>、>=或用作表达式时。


    更新:

    我问的是,我是否已经对临时表进行了验证。当我从临时表中选择进行插入时,是否需要再次验证?

    如果你 在将数据插入到 #诱人的 并且您确定插入数据后没有任何更改 ,然后您可以直接插入数据,不需要检查 无效的 两次。