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

时间:2018-11-17 06:03:41

标签: sql sql-server validation

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

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

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))

是否有必要在插入之前检查这些值是否为null和empty?我可以公平地说,如果我已经验证了所有内容,那么在插入时再次进行验证将是一种浪费。我已经做过空检查等。

我不确定这个问题是否属于代码审查,如果可以的话,请关闭它。

此表中只有一行。

1 个答案:

答案 0 :(得分:5)

您可以简单地这样做

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

如果要检查NULL并用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中有1行时才起作用,如果该表有1行以上,则会抛出错误

  

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


更新:

  

我要问的是我是否已经对temp表进行了验证,当我从中进行选择时是否有必要再次进行验证?

如果在将数据插入#TempTable时已经检查过数据,并且确定插入后数据没有变化,那么您只需插入数据即可直接,无需检查NULL两次。