本篇来聊聊如何书写漂亮、整洁、优雅的SQL脚本,下面这些是我个人总结、整理出来的。姑且做个抛砖引玉吧,呵呵,欢迎大家一起来讨论。
 
我们首先来看看一段创建数据表的脚本(如下所示),你是否觉得有什么不妥或是不足呢?如果是你,你怎样书写呢?

代码

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])
)

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

代码

USE [Test];
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 PermissionID from  Permission 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.BindToSchema WHERE DcUserID=@UserID)    

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

代码

SELECT Permission FROM  Permission
 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)

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

代码

'SELECT   Order_ID = @OrderID, CampaignCode= @CampaignCode, ProductCode = @ProductCode, StartDate= SpotDate,  
   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:总结、学习一些书写漂亮的格式。

限于篇幅,下面给出一些我见过的、写的比较优雅的脚本,大家也可以贴出自己写得优美的代码,一起学习探讨。

代码

-- Construct column list
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;'

代码

DECLARE
  @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脚本?的更多相关文章

  1. 书写优雅的shell脚本(一)- if语句

    使用unix/linux的程序人员几乎都写过shell脚本,但这其中很多人都是为了完成功能而在网上找代码段,这样写出来的shell脚本在功能方面当然是没有什么问题,但是这样的方式不能写出优雅的shel ...

  2. PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。

    PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...

  3. jdbc在mysql下一次执行多条sql脚本

    默认连接mysql的时候一次只能执行一条sql.要批量执行sql需要在jdbcUrl中增加“allowMultiQueries=true”参数,完整jdbcUrl如下:  jdbc:mysql://l ...

  4. SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)

    需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监 ...

  5. MySQL命令行下执行.sql脚本详解

    本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...

  6. 常用SQL脚本操作

    SQL 脚本创建数据库.表及简单查询 --------------------------------------------------------------------------------- ...

  7. shell中创建mysql库和执行sql脚本

    以前执行oracle脚本都是放到plsql中执行 mysql 脚本执行: (1).先创建一个worlddb库 (2).导入sql脚本: 这就ok啦,哈哈.

  8. access生成sql脚本,通过VBA调用ADOX

    access生成sql脚本,通过VBA调用ADOX. 使用 MS Access 2016 的VBA,读取mdb文件中的所有表结构(数据类型/长度/精度等),生成对应的SQL create table语 ...

  9. mysql命令行导入sql脚本中文变问号问题

    之前一直用工具连接mysql虽然小问题不断也都无伤大雅,最近做金融云项目,只能通过服务器的内网访问数据库,也就是说只能在linux下通过命令行访问,在导入中文的时候发现都变成问号了,经过查询资料解决, ...

随机推荐

  1. SQL Server 插入含有中文字符串出现乱码现象的解决办法

    ELECT  COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')       --查询SQLServer编码格式的语句 下面 ...

  2. CSS根据子元素个数不同定义样式

    近日面试,遇见了一个这样的问题,不会,便记下来. 问题:如何根据子元素个数的不同定义不同的样式? 代码:HTML <ul> <li>1</li> <li> ...

  3. 微信小程序demo-环球小镇

    微信小程序-环球小镇说明:实现了环球小镇(huanqiuxiaozhen.com)移动端商城客户端部分功能,包括首页,分类,购物车,帐户,品牌列表,商品详情等功能.    项目下载:http://bb ...

  4. CTF---隐写术入门第三题 打不开的文件

    打不开的文件分值:10 来源: 实验吧 难度:中 参与人数:2718人 Get Flag:1222人 答题人数:1276人 解题通过率:96% 咦!这个文件怎么打不开? 解题链接: http://ct ...

  5. noip2015 提高组 解题报告

    完美退役...说好的不卡常呢QAQ day1: T1:模拟题?..考察选手将题目描述翻译成代码的能力233 //其实真相是考验rp..论代码雷同的危害233 T2:简单图论,每个点出度为1所以是基环内 ...

  6. Prim最小生成树板子

    普里姆算法可以称为"加点法",每次迭代选择代价最小的边对应的点,加入到最小生成树中.算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点. 邻接矩阵存图  时间复杂度O(n^2 ...

  7. C# 构造器总结

    在C#中,构造器分为实例构造器和类型构造器, 一.实例构造器 构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值 在一个类中, ...

  8. SQL强化(三) 自定义函数

    ---恢复内容开始--- Oracle中我们可以通过自定义函数去做一些逻辑判断,这样可以减少查询语句,提高开发效率 create  -- 创建自定义函数 or replace -- 有同名函数就替换, ...

  9. Sql Server——数据增删改

    所谓数据的增删改就是在创建好数据库和表后向表中添加数据.删除表中的数据.更改表中的一些数据. 新增数据: 语法一: insert into 表名 values (数据内容)        --这里需要 ...

  10. 小白的Python之路 day5 模块XML特点和用法

    模块XML的特点和用法 一.简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今 ...