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存储过程编写规则的更多相关文章

  1. sqlServer存储过程与sql语句的区别

    sqlServer   存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...

  2. SqlServer存储过程应用二:分页查询数据并动态拼接where条件

    前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...

  3. 你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  5. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  6. Sqlserver 存储过程中结合事务的代码

    Sqlserver 存储过程中结合事务的代码  --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...

  7. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  8. SQLServer 存储过程嵌套事务处理

    原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...

  9. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

随机推荐

  1. HTML标题

    HTML 标题 在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题 ...

  2. turtle文库 ——python

    本文将会为您介绍关于python--turtle库函数,学会这个库函数,会有很多让你意想不到的事情发生哦! 我也也会为你们,简单的编写几个代码,让你们看一下turtle函数的魅力 Turtle库是Py ...

  3. springcloud学习资料汇总

    收集Spring Cloud相关的学习资料 学习Spring Cloud首先需要了解Spring Boot,不了解Spring Boot的同学戳这里Spring Boot学习资料汇总 重点推荐:Spr ...

  4. java游戏开发杂谈 - 游戏物体

    现实生活中,有很多物体,每个物体的长相.行为都不同. 物体存在于不同的空间内,它只在这个空间内发生作用. 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理. 需要它的时候,就把它造出来,不需 ...

  5. .NET 反编译调试神器:dnSpy了解一下

    如果客户环境出了问题,而又无法快速定位问题,可以借助dnSpy进行反编译调试跟踪. 可前往dnSpy官网下载或直接从我的分享链接下载(内置包含.NET Framework 4.7.1,若运行提示需要安 ...

  6. 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...

  7. 最详细的Windows平台安装MongoDB教程

    一.MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB将数据存储为一个文档,数据结构由键值(ke ...

  8. 学习 JavaScript(二)在 HTML 中使用 JS

    基本用法 在 HTML 中使用 <script> 元素引入 Javascript , <script> 有以下 4 个常用属性: async: 异步加载,只对外部脚步有效. d ...

  9. PHP开发模式之-单例模式

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class  Db{ private function __construct(){} private static ...

  10. HTML文本框样式大全

    粘贴自Christian.Cao 博客园地址 : https://www.cnblogs.com/QQ862668193/p/6893797.html 输入框景背景透明:<input style ...