SQLServer存储过程编写规则
SQLServer编写规则
1、 存储过程
a) 在程序应用中,对于数据库“写”操作的功能通过存储过程来实现。
b) 存储过程命名:
SP_+表名(+功能名)
对于一个表有两个以上的存储过程时使用+功能名,功能名必须能清晰显示该功能的作用。如果是针对同一张表的添加、修改、删除操作,可以在同一个存储过程中,通过传递一个Flag参数(Int型)来区分,Flag参数定义如下:
Flag=1:添加
Flag=2:修改
Flag=3:删除
c) 如果表中的字段过多,可以将添加、修改、删除、或者其它操作分开来写
d) 存储过程必须在开始处加上注释:
/*********************************************************
** 功能:
** 输入参数:(如果通过该输入参数进行判断必须在此注明)
** 输出参数:(如果有输入参数必须在此注明)
**********************************************************/
e) 存储过程中传入参数:使用@P_开头
f) 存储过程中涉及到返回值(不是数据库中的值的时候)的地方需要返回为常量@P_ReCode,参数定义如下(针对普遍情况,不包含特殊情况处理):
ReCode = 0:操作执行正确
ReCode = -1:操作执行失败
ReCode = -2:记录已经存在
g) 存储过程中涉及到常量的地方,应该在declare中赋值给一个变量,便于修改。
h) 变量定义时必须添加注释。
i) 有较为复杂的逻辑结构时必须添加注释。
j) 在存储过程参数定义完成后AS之前,需要加入以下代码
--WITH ENCRYPTION
2、 函数(Function)
在数据库中需要用到函数(Function),命名方式为:
FN_****,其中****的规则同存储过程
3、 查询操作
所有“读”操作(查询)通过SQL语句来实现。
对于写查询语句需要注意遵守以下规则:
a) 在.NET中需要拼接字符串时,使用值类型的ToString方法和运用StringBuilder类(其.NET 命名空间是System.Text),通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。示例如下:
StringBuilder sb = new StringBuilder();
Database.TParams[] t = new Database.TParams[2];
sb.Append("SELECT * FROM RMP_CRQuestion_Info");
sb.Append(" WHERE RMP_CRQuestion_ActiveFlag = @RMP_CRQuestion_ActiveFlag");
sb.Append(" AND RMP_CRQuestion_DeletedFlag = @RMP_CRQuestion_DeletedFlag");
sb.Append(" ORDER BY RMP_CRQuestion_Order");
t[0] = new Database.TParams("@RMP_CRQuestion_ActiveFlag", 1, SqlDbType.Char, Constant.STR_ACTIVE, 1);
t[1] = new Database.TParams("@RMP_CRQuestion_DeletedFlag", 1, SqlDbType.Char, Constant.STR_UNDELETED, 1);
try
{
ds = db.RunSQLReturnRS(sb.ToString(), ref t);
}
catch
{
throw new Exception("DB08040:获取全部变更分析问题产生错误!");
}
b) 避免使用不兼容的数据类型, 例如float和int、char和varchar、binary和varbinary是不兼容的。示例如下:
Select SYS_Role_Name from SYS_Role_Info
Where SYS_Role_DeletedFlag = ‘1’
应改为:
Select SYS_Role_Name from SYS_Role_Info
Where SYS_Role_DeletedFlag = 1
c) 尽量避免在WHERE子句中对字段进行函数或表达式操作,如:
SELECT A1 FROM T1 WHERE F1/2=100
应改为:
SELECT A1 FROM T1 WHERE F1=100*2
SELECT A1 FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT A1 FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:查询时要尽可能将操作移至等号右边
d) 尽量避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符
e) 合理使用EXISTS,NOT EXISTS子句。如下所示:
SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
应改为:
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以写成:
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')
SELECT hdr_key FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
可以写成:
SELECT a.hdr_key FROM hdr_tbl a---- tbl a 表示tbl用别名a代替
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)
SELECT hdr_key FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
f) 能够用BETWEEN的就不要用IN
SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
应改为:
SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
g) 不允许Select * 这样的写法,要将需要的字段全部写出来
h) 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。
i) 在使用UNION的时候,如果单一的查询语句返回唯一的一组数据时,用UNION ALL代替UNION
j) SQL语句中的表连接数尽量少。在连接合表时,首先连接主键,然后是外键,如果没有主键,那么首先联合外键。在某种情况下,两个表之间可能不只一个的连接条件,这时在WHERE 子句中将连接条件完整的写上
k) 在Where语句中检查表的主键和他们的位置(如果是联合主键的话),按顺序连接表,并把所有的主键放在同一边(左边或右边)
l) 能用DISTINCT的就不用GROUP BY
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
可改为:
SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
当一些查询语句中没有建立在主键和外键上时,通知DBA,为这些查询建立特殊索引
SQLServer存储过程编写规则的更多相关文章
- sqlServer存储过程与sql语句的区别
sqlServer 存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...
- SqlServer存储过程应用二:分页查询数据并动态拼接where条件
前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...
- 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)
解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...
- Sqlserver 存储过程中结合事务的代码
Sqlserver 存储过程中结合事务的代码 --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- SQLServer 存储过程嵌套事务处理
原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...
- makefile的编写规则
2. 编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...
随机推荐
- django 多对多自定义第三张表时的注意事项
杂交(自定义第三张表+ManyToManyField) # modles.py class Boy(models.Model): name = models.CharField(max_length= ...
- sudo apt-get update: 0% [正在等待报头]
问题描述:使用apt-get下载一个文件,由于下载的太慢,使用Ctrl+C强制结束.然后输入sudo apt-get update,想继续下载其他文件.结果出现如标题所示的错误,截图如下:按照网上说的 ...
- 审计篇丨PHPcms9.6.3后台XSS审计
引言 今天与大家分享的文章是关于审计思路的知识点,用到的是PHPcms的最新版本,因为常规扫描无法进入后台,所以我们修改了代码让扫描器爬虫爬到后台. 漏洞复现环境 安装PHPstudy 安装PHPcm ...
- 从壹开始微服务 [ DDD ] 之终篇 ║当事件溯源 遇上 粉丝活动
回首 哈喽~大家好,时间过的真快,关于DDD领域驱动设计的讲解基本就差不多了,本来想着周四再开一篇,感觉没有太多的内容了,剩下的一个就是验证的问题,就和之前的JWT很类似,就不打开一个章节了,而且这个 ...
- 零基础如何学Python爬虫技术?
在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...
- 《k8s-1.13版本源码分析》-源码调试
源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...
- 服务端预渲染之Nuxt(爬坑篇)
Nuxt是解决SEO的比较常用的解决方案,随着Nuxt也有很多坑,每当突破一个小技术点的时候,都有很大的成就感,在这段时间里着实让我痛并快乐着.在这里根据个人学习情况,所踩过的坑做了一个汇总和总结. ...
- windows代码,路径分割
BOOL SplitPathName( PWSTR MyXbpathBuffer, wstring& wdrive, wstring& wdir, wstring& wfnam ...
- 入门系列之使用Sysdig监视您的Ubuntu 16.04系统
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由乌鸦 发表于云+社区专栏 介绍 Sysdig是一个全面的开源系统活动监控,捕获和分析应用程序.它具有强大的过滤语言和可自定义的输出,以 ...
- C# 操作Word页眉页脚——奇偶页/首页不同、不连续设置页码、复制页眉页脚、锁定页眉页脚、删除页眉页脚
前言 本文是对Word页眉页脚的操作方法的进一步的阐述.在“C# 添加Word页眉页脚.页码”一文中,介绍了添加简单页眉页脚的方法,该文中的方法可满足于大多数的页眉页脚添加要求,但是对于比较复杂一点的 ...