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 ...
随机推荐
- jackson json转对象 json转集合 对大小写支持
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, isGetterVisibi ...
- Map集合中,关于取值和遍历的相关操作
这是自己的关于map集合的相关操作的小研究,分享给大家. 主要代码内容包含以下: 1,map集合的遍历 2,根据key值获取value值 3,根据value值获取key值 4,返回最大value值对应 ...
- 文本离散表示(一):词袋模型(bag of words)
一.文本表示 文本表示的意思是把字词处理成向量或矩阵,以便计算机能进行处理.文本表示是自然语言处理的开始环节. 文本表示按照细粒度划分,一般可分为字级别.词语级别和句子级别的文本表示.字级别(char ...
- javascript深入理解--作用域,作用域链,闭包的面试题解
一.概要 作用域和作用域链是js中非常重要的特性,关系到理解整个js体系,闭包是对作用域的延伸,其他语言也有闭包的特性. 那什么是作用域?作用域指的是一个变量和函数的作用范围. 1.js中函数内声明的 ...
- python中的del
python中的del,只删除变量,不删除数据,具体表现为: a=1,c=a,del a,(c=1) 和 a = [1,2,3,4,5] b= a[0] del a[0] print a ([2,3, ...
- 在MySQL中实现Rank高级排名函数【转】
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- idea配置tomcat运行按钮置灰,下拉没有自定义的tomcat选项
一.问题 下拉没有自定义tomcat的选项 run按钮置灰,点不了 二.解决 添加自己的tomcat时,一定要点加号,不要用那个默认的.
- 项目分层-----MVC
MVC设计模式:modle层,view层,controller层 以前学习的servlet其实就是一个java类,或者说经过规范的java类,实际进行跳转时,还是要在web.xml文件中配置才能正常跳 ...
- mt8665芯片怎么样?联发科mt8665芯片参数介绍
MediaTek的MT8665是一款高度集成的LTE片上系统(SoC),它包含了先进的功能,例如LTE cat.4.Octa HMP核心在1.5GHz下工作.3D图形(OpenGLES 3.0).13 ...
- Android 上传图片到服务器 okhttp一
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...