一般的编程语言建议是进行防御式编程,在开始处理之前先检查所有参数的合法性。
但实际上,对数据库编程而言,尽量同时做几件事情的进攻式编程有切实的优势。
*/
--我们SP中常见的防御式编程示例:
--场景一:判断数据是否存在
注:C为一个不可空字段
IF NOT EXISTS( SELECT TOP (1) 1 FROM A WITH(NOLOCK) WHERE ID = @ID ) BEGIN SET @Response = 'E' GOTO ErrorHandle END SELECT TOP (1) @B = C FROM A WITH(NOLOCK) WHERE Id= @ID
修改如下:
SELECT TOP (1) @B= C FROM dbo.A WITH(NOLOCK) WHERE Id= @Id IF @B IS NULL BEGIN SET @Response = 'E' GOTO ErrorHandle END
这种情形下,C是非空字段,那么就可以直接去它来判断这个Item是否存在,这样就减少一次A表的查询
--场景二:当数据存在时更新,不存在时插入 IF EXISTS( SELECT TOP 1 1 FROM dbo.A WITH(NOLOCK) WHERE 字段2= 1583) BEGIN UPDATE TOP(1) dbo.A SET 字段1= 'ccc' WHERE 字段2= 2123 END ELSE BEGIN INSERT INTO dbo.A ( 字段1, 字段2 ) VALUES ( aaa, 'ccc' ) END /* 分析: 这种使用select去判断存在性是不建议的 我们可以直接通过where条件去update,当update所影响的行数等于0时,就说明该数据不存在,这时再insert 修改如下: */ UPDATE TOP(1) dbo.A SET 字段1= 'aaa' WHERE 字段2 = 123 IF @@ROWCOUNT = 0 BEGIN INSERT INTO dbo.A ( 字段1, 字段2 ) VALUES ( aaa, 'ccc' ) END /* 总结: 以合理的可能性为基础。 以概论为基础进行编程。 假设最可能的结果。 不是的确必要,不要采用异常捕捉的处理方式。 */