如何书写优雅、漂亮的SQL脚本?

代码
[TableID] [int] IDENTITY(1,1) NOT NULL,
[IpAddress] [nvarchar](15) NOT NULL,
[DataBaseName] [nvarchar](35) NOT NULL,
[TableName] [nvarchar](35) NOT NULL,
[Description] [nvarchar](150) NULL,
CONSTRAINT [PK_TableDataDictionary] PRIMARY KEY([Tableid])
)

可能你也没有觉得它有什么不妥,因为你一直都是这样书写哦。而且更混乱、更杂的的脚本你也见过,也可能习惯了;那么来看看下面的脚本,

代码
GO
IF OBJECT_ID(N'TableDataDictionary') IS NULL
CREATE TABLE [dbo].[TableDataDictionary]
(
[TableID] INT IDENTITY(1,1) NOT NULL,
[IpAddress] NVARCHAR(15) NOT NULL,
[DataBaseName] NVARCHAR(35) NOT NULL,
[TableName] NVARCHAR(35) NOT NULL,
[Description] NVARCHAR(150) NULL,
CONSTRAINT [PK_TableDataDictionary] PRIMARY KEY([Tableid])
);
ELSE
PRINT 'This table have been exist in database';
GO

上面两段脚本比起来,你是否觉得下面的更美观、优雅呢?
接下来我们来看看四段申明变量的脚本,自己可以对比

代码
DECLARE @PayType VARCHAR(50), @Rate FLOAT, @FeeRate FLOAT ,@OtheFee FLOAT;
DECLARE @StartDate DATETIME, @EndDate DATETIME;
DECLARE @CmdSql NVARCHAR(MAX);
DECLARE @MyCardBillFee FLOAT, @MyCardFee FLOAT;
---------------------------------------------------------------------------------------------------------
(二)
DECLARE @PayType VARCHAR(50);
DECLARE @Rate FLOAT;
DECLARE @FeeRate FLOAT;
DECLARE @OtheFee FLOAT;
DECLARE @StartDate DATETIME;
DECLARE @EndDate DATETIME;
DECLARE @CmdSql NVARCHAR(MAX);
DECLARE @MyCardBillFee FLOAT;
DECLARE @MyCardFee FLOAT;
---------------------------------------------------------------------------------------------------------
(三)
DECLARE @PayType VARCHAR(50); --支付类型
DECLARE @Rate FLOAT; --汇率比例
DECLARE @FeeRate FLOAT; --手续费比例
DECLARE @MyCardFee FLOAT; --......
DECLARE @OtheFee FLOAT; --......
DECLARE @MyCardBillFee FLOAT; --......
DECLARE @StartDate DATETIME; --......
DECLARE @EndDate DATETIME; --......
DECLARE @CmdSql NVARCHAR(MAX); --......
---------------------------------------------------------------------------------------------------------
(四)
DECLARE
@PayType AS VARCHAR(50); --支付类型
@Rate AS FLOAT; --汇率比例
@FeeRate AS FLOAT; --手续费比例
@MyCardFee AS FLOAT; --......
@OtheFee AS FLOAT; --......
@MyCardBillFee AS FLOAT; --......
@StartDate AS DATETIME; --......
@EndDate AS DATETIME; --......
@CmdSql AS NVARCHAR(MAX); --......
-------------------------------------------------------------------------------------------------------

如果是你,你愿意运用哪种书写格式呢? 个人觉得(一)写得极极糟糕,不仅阅读不方便、而且也不方便注视。(二)则是我以前习惯书写的格式,一来没有注视、二来看起来没有(三)、(四)美观、大方。
存储过程、函数头部注视的样式(个人曾今用过的样式):
代码

--=============================================================================================================
-- Function : dbo.USP_GetEmployeById 按Id获取雇员信息
-- Auhtor : Kerry
-- Create Date : 2010-08-12
-- Description : 详细描述存储过程功能(对Function 功能补充)、以及参数、输出结果的描述
--=============================================================================================================
-- 2010-08-12 : 修改....增加........
-- 2010-08-13 : 修改....增加.......
--=============================================================================================================
Function 简要描述存储过程、函数功能。
Desctiption 详细描述存储过程、函数功能,以及参数、输出结果描述
(二)
--=============================================================================================================
-- Create Date : 2010-08-11
-- Author : Kerry
-- Modified Date : 2010-08-12
-- Modified Content : 修改表字段、增加汇率计算.....
-- Modified Date : 2010-08-13
-- Modified Content : 修改表字段、增加汇率计算.....
-- Description : 计算抢车位社区游戏的月充值结构信息。
--=============================================================================================================
(三)
/**************************************************************************************************************
Auhtor : Kerry
Create Date : 2010-08-12
Modified Date :
Modified Content :
Description : 如何书写漂亮、优雅的SQL脚本
**************************************************************************************************************/
( 四)
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
使用MSSMS新建存储过程,它自动生成的样式

个人觉得(一) >= (二) > (三) > (四) ,不知道大家有没有更好的格式推荐。
下面看看这样一段脚本,一眼就觉得有点糟糕,其实实际开发中脚本比这个可能复杂得多,头痛吧

( select top 1 resourceid from [Resource] where resourcename=@resourcename) and
actionid=(select top 1 actionid from [Action] where actionname=@actionname)
AND SchemaId in (SELECT SchemaId FROM dbo.BindToSchema WHERE DcUserID=@UserID)
首先就应该统一关键字大小写,不要一部分大写、一部分小写。然后从结构上面调整。 可能每个人的审美观、习惯的格式不同,这个无所谓,也没有必要统一。 但是你书写出来的脚本至少要结构清晰,一目了然。不要让别人费很大的劲去调整格式,然后才能理解它的逻辑,如果写出上面或是比上面更糟糕的脚本,我想项目经理真应该教训教训你。这样只会给后来维护的人痛苦不堪(实际开发中可能比这糟糕十倍呢,想必很多人是深受其害啊)

代码
WHERE
resourceid =( SELECT TOP 1 resourceid FROM [Resource] WHERE resourcename=@resourcename)
AND actionid =(SELECT TOP 1 actionid FROM [Action] WHERE actionname=@actionname)
AND SchemaId IN (SELECT SchemaId FROM dbo.DcUserBindToSchema WHERE DcUserID=@UserID)

动态组合语句是否让你的脚本看起来林乱不堪啊,你有没有试过让其在某些方面看起来美观点、优雅点啊、
代码

EndDate = EndDate, StartTime= Media_StartTime, EndTime = Media_EndTime, Duration = (CASE WHEN Media_Duration IS NULL OR ELSE Media_Duration END), Adformat= Media_Adformat , Color = Media_Color , --Media_Showing, Size = Media_Size, SpotType = Media_SpotType, URL = Media_URL , ScheduleNo = ScheduleNo ,
Plan_Insertion_ID = Plan_Insertion_ID
那下面书写格式是不是美观、整洁些呢
SELECT
Order_ID = @OrderID
, CampaignCode = @CampaignCode
, ProductCode = @ProductCode
, StartDate = SpotDate
, EndDate = EndDate
, StartTime = Media_StartTime
, EndTime = Media_EndTime
, Adformat = Media_Adformat
, Color = Media_Color
, Impression = Media_Impression
, Location = Media_Location
, Material = Media_Material
, Position = Media_Position
, Program = Media_Program
, Scale = Media_Scale --Media_Showing
, Size = Media_Size
, SpotType = Media_SpotType
, URL = Media_URL
, ScheduleNo = ScheduleNo
, Plan_Insertion_ID = Plan_Insertion_ID
, Position = Media_Position
'

怎么样是否觉得下面的”清新脱俗“,眼前一亮啊,呵呵,不是在说美女啊。看看我以前一个同事写的吧,我只截取了一部分。
写着觉得有点天马行空、不着边际了,其实这个话题有点大,而且和个人习惯、审美观有莫大联系,所谓众口难调,不过有几点应该是一致的:
1:书写脚本的时候,多用空格、Tab键,不要让代码拥挤,杂糅在一起。
2:让代码看起来觉得舒服,一目了然,不要一看就觉得头痛,要细细看上好久,才了解逻辑结构
3:让代码看起来整洁、优美。凌乱不堪是大忌。
4:总结、学习一些书写漂亮的格式。
限于篇幅,下面给出一些我见过的、写的比较优雅的脚本,大家也可以贴出自己写得优美的代码,一起学习探讨。

代码
SET @sql =
N'SET @result = ' + @newline +
N' STUFF(' + @newline +
N' (SELECT N'','' + '
+ N'QUOTENAME(pivot_col) AS [text()]' + @newline +
N' FROM (SELECT DISTINCT('
+ @on_cols + N') AS pivot_col' + @newline +
N' FROM' + @query + N') AS DistinctCols' + @newline +
N' ORDER BY pivot_col' + @newline +
N' FOR XML PATH('''')),' + @newline +
N' 1, 1, N'''');'
EXEC sp_executesql
@stmt = @sql,
@params = N'@result AS NVARCHAR(MAX) OUTPUT',
@result = @cols OUTPUT;
-- Create the PIVOT query
SET @sql =
N'SELECT *' + @newline +
N'FROM' + @newline +
N' ( SELECT ' + @newline +
N' ' + @on_rows + N',' + @newline +
N' ' + @on_cols + N' AS pivot_col,' + @newline +
N' ' + @agg_col + N' AS agg_col' + @newline +
N' FROM ' + @newline +
N' ' + @query + @newline +
N' ) AS PivotInput' + @newline +
N' PIVOT' + @newline +
N' ( ' + @agg_func + N'(agg_col)' + @newline +
N' FOR pivot_col' + @newline +
N' IN(' + @cols + N')' + @newline +
N' ) AS PivotOutput;'

代码

@schemaname AS NVARCHAR(128),
@tablename AS NVARCHAR(128),
@colname AS NVARCHAR(128),
@sql AS NVARCHAR(805);
SET @schemaname = N'dbo';
SET @tablename = N'Orders';
SET @colname = N'CustomerID';
SET @sql = N'SELECT COUNT(DISTINCT '
+ QUOTENAME(@colname) + N') FROM '
+ QUOTENAME(@schemaname)
+ N'.'
+ QUOTENAME(@tablename)
+ N';';
EXEC(@sql);

如何书写优雅、漂亮的SQL脚本?的更多相关文章
- 书写优雅的shell脚本(一)- if语句
使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shel ...
- PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。
PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...
- jdbc在mysql下一次执行多条sql脚本
默认连接mysql的时候一次只能执行一条sql.要批量执行sql需要在jdbcUrl中增加“allowMultiQueries=true”参数,完整jdbcUrl如下: jdbc:mysql://l ...
- SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)
需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监 ...
- MySQL命令行下执行.sql脚本详解
本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...
- 常用SQL脚本操作
SQL 脚本创建数据库.表及简单查询 --------------------------------------------------------------------------------- ...
- shell中创建mysql库和执行sql脚本
以前执行oracle脚本都是放到plsql中执行 mysql 脚本执行: (1).先创建一个worlddb库 (2).导入sql脚本: 这就ok啦,哈哈.
- access生成sql脚本,通过VBA调用ADOX
access生成sql脚本,通过VBA调用ADOX. 使用 MS Access 2016 的VBA,读取mdb文件中的所有表结构(数据类型/长度/精度等),生成对应的SQL create table语 ...
- mysql命令行导入sql脚本中文变问号问题
之前一直用工具连接mysql虽然小问题不断也都无伤大雅,最近做金融云项目,只能通过服务器的内网访问数据库,也就是说只能在linux下通过命令行访问,在导入中文的时候发现都变成问号了,经过查询资料解决, ...
随机推荐
- Ubuntu系统下将默认的python2.7升级到3.5
在ubuntu 的终端中用代码下载最新的Python sudo apt-get install python3 系统会提示输入Linux 的密码,输入密码后下载 刚才下载的Python程序被安装在us ...
- Label 和 checkbox 不为人知的小秘密
最近开发的时候同事遇见了一个问题,点击label的时候改变checkbox的属性,或许大家觉得这是一个很简单的问题,然而这里面却蕴藏着一个大坑! 举例说明: 页面简单,就是一个 <input i ...
- 通过yum安装mysql数据
1. 卸载掉原有mysql 因为mysql数据库在Linux上实在是太流行了,所以目前下载的主流Linux系统版本基本上都集成了mysql数据库在里面,我们可以通过如下命令来查看我们的操作系统上是否已 ...
- feed 流数据请求时机的两个思路
最近 SF 首页 进行了大改版,效果如下: 其他地方都没什么难点,中间的 feed 流思考了不少时间,效果需要类似微博或者知乎 feed 流.之前一直没有做过类似的功能,现总结两个方案. 方案一 方案 ...
- Webpack+vue2.0如何注册全局组件 (01)
Part 1, 问题: webpack + vue2.0框架中,如何在入口js中注册组件? 就是在一个月以前,匆匆闯入vuejs这个社群,基本了解了vuejs的一些基础特性和语法.笔者兴致勃勃地开始想 ...
- HashSet源码阅读
HashSet的实现基于HashMap 看几个简单的初始化方法 public HashSet() { map = new HashMap<>(); } public HashSet(Col ...
- 【转】qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式
狸窝 复制 收藏 保存到桌面 快速找教程方案 反馈需求 社会主义核心价值观 客服QQ41442901 马上注册 升级VIP 对于视频文件之间的转换问题,我也已经是无力吐槽了,每个 ...
- Zabbix实战-简易教程(3)--DB安装和表分区
一.DB安装环境 主机角色 主机IP VIP 操作系统版本 软件版本 DB Master A 192.168.1.97 (主从) CentOS 6.5 64bit mysql-5.6.21 DB Sl ...
- vue-cli完整地引入element-ui
1因为该组件会依赖于jQuery,所以先安装jQuery所需依赖: 进入npm控制台,输入指令: cnpm install jquery --save-dev 然后在入口文件main.js中引入: i ...
- OI回忆录——一个过气OIer的智障历程
初中 初一参加学校信息学选修课,一周一节课,学pascal. 初一寒假(大约是)入选(其实是钦定吧)当时加上我只有3人的校队(我当然是最弱的一个. 当时甚至有幸得到叉姐授课(现在才知道这是多么难得的机 ...