【SQLSERVER学习笔记】进攻式编程

一般的编程语言建议是进行防御式编程,在开始处理之前先检查所有参数的合法性。
但实际上,对数据库编程而言,尽量同时做几件事情的进攻式编程有切实的优势。
*/

--我们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

/*
总结:
以合理的可能性为基础。
以概论为基础进行编程。
假设最可能的结果。
不是的确必要,不要采用异常捕捉的处理方式。
*/    

 

posted @ 2015-12-19 10:34  人生无赖  阅读(473)  评论(0编辑  收藏  举报