【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 /*
总结:
以合理的可能性为基础。
以概论为基础进行编程。
假设最可能的结果。
不是的确必要,不要采用异常捕捉的处理方式。
*/
【SQLSERVER学习笔记】进攻式编程的更多相关文章
- SQLServer 学习笔记之超详细基础SQL语句 Part 8
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 7------------------- --触发器str_trigge ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 7
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 6------------------- 29 存储过程和触发器 存储过 ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 5
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 4------------------- 21使用默认 默认(也称默认值 ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 4
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 3------------------- 17 带比较运算符的嵌套查询 ...
- SQLServer学习笔记系列6
一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...
- SQLServer学习笔记系列5
一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...
- SQLServer学习笔记系列3
一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...
- SQLServer学习笔记系列2
一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继续学习Sqlserver,一步一步 ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
随机推荐
- python2文件转换为exe可执行文件
windows下py文件的运行需要安装python,如果是exe文件就可以直接运行 1. 直接在命令行用pip安装 pyinstaller pip install pyinstaller 2 在命令行 ...
- HttpContext.Current.Request.RawUrl是什么意思?
原始 URL 定义为 URL 中域信息之后的部分.在 URL 字符串 http://www.contoso.com/articles/recent.aspx 中,原始 URL 为/articles/r ...
- javascript多浏览器的兼容
一.document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document. ...
- Spring中无法访问resources目录下页面或静态资源
1.新建项目,在 resources 目录下创建 views 目录,在 views 目录下创建 index.html 页面,项目跑起来,浏览器访问页面,提示找不到页面之类的错误提示. 2.再尝试访问图 ...
- spring org.springframework.web.bind.annotation 常用注解
开发中常用的注解记录,查缺补漏 Request注解 @RequestBody @RequestHeader @RequestMapping @RequestParam @RequestPart @Co ...
- 常见的浏览器兼容性问题与解决方案——CSS篇
1.不同的浏览器的标签默认的外补丁和内补丁不同 问题症状:随便写几个标签,不加样式控制的情况下,各自的margin和padding差异较大. 碰到频率:100% 解决方案:初始化CSS的默认样式,*{ ...
- c++ 读写结构体到文件
可以使用fwrite()将一个结构体写入文件: fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite ...
- Element和vue框架报错提示
上面报错提示Error in render function: "TypeError:Cannot read property '$options' of undefined" 就 ...
- SQL日期转换
SQL 语句日期用法及函数 --DAY().MONTH().YEAR()——返回指定日期的天数.月数.年数: select day(cl_s_time) as '日' from class --返回 ...
- 树的各种操作java
package mystudy; import java.io.UnsupportedEncodingException; import java.util.LinkedList; import ja ...