赏心悦目!SQL Server漂亮脚本书写格式

时间:2022-10-24 17:35:17

    【IT168 技术文档】本篇来聊聊如何书写漂亮、整洁、优雅的SQL脚本,下面这些是我个人总结、整理出来的。姑且做个抛砖引玉吧,呵呵,欢迎大家一起来讨论。

  我们首先来看看一段创建数据表的脚本(如下所示),你是否觉得有什么不妥或是不足呢?如果是你,你怎样书写呢?

#div_code img{border:0px;} 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])
)

 

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

#div_code img{border:0px;} 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

 

  上面两段脚本比起来,你是否觉得下面的更美观、优雅呢?

  接下来我们来看看四段申明变量的脚本,自己可以对比

#div_code img{border:0px;}          (一)
DECLARE @PayType VARCHAR(
50
),  @Rate FLOAT, @FeeRate FLOAT ,@OtheFee FLOAT;
DECLARE @StartDate DATETIME,   @EndDate DATETIME;
DECLARE @CmdSql NVARCHAR(MAX);
DECLARE @MyCardBillFee FLOAT, @MyCardFee    FLOAT;
#div_code img{border:0px;}
                                (二)
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;
#div_code img{border:0px;}                             
                            (三)

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);            
--
......
#div_code img{border:0px;}                           (四)
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);          --
......

 

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

  存储过程、函数头部注视的样式(个人曾今用过的样式):

#div_code img{border:0px;}         (一)

--=============================================================================================================

--            Function         :            dbo.USP_GetEmployeById 按Id获取雇员信息
--
            Auhtor            :            Kerry
--            Create Date       :            2010-08-12

--            Description       :            详细描述存储过程功能(对Function 功能补充)、以及参数、输出结果的描述
--=============================================================================================================

--            2010-08-12        :           修改....增加........
--            2010-08-13
        :            修改....增加.......

 

  Function 简要描述存储过程、函数功能。

  Desctiption 详细描述存储过程、函数功能,以及参数、输出结果描述

#div_code img{border:0px;}    (二)

--        Create Date            :        2010-08-11

--        Author                 :        Kerry
--        Modified Date          :        2010-08-12

--        Modified Content       :        修改表字段、增加汇率计算.....
--        Modified Date          :        2010-08-13

--        Modified Content       :        修改表字段、增加汇率计算.....
--        Description            :        计算抢车位社区游戏的月充值结构信息。
#div_code img{border:0px;}   (三)

        Auhtor                 :            Kerry
        Create
Date            :            2010-08-12

        Modified
Date          :
        Modified Content       :
        Description            :            如何书写漂亮、优雅的SQL脚本
#div_code img{border:0px;}   ( 四)
-- Author:        <Author,,Name>

-- Create date: <Create Date,,>
-- Description:    <Description,,>

 

  使用MSSMS新建存储过程,它自动生成的样式

  个人觉得(一) >= (二) > (三) > (四) ,不知道大家有没有更好的格式推荐。  


  下面看看这样一段脚本,一眼就觉得有点糟糕,其实实际开发中脚本比这个可能复杂得多,头痛吧

#div_code img{border:0px;} 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)  

 

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

#div_code img{border:0px;} 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)

 

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

#div_code img{border:0px;} '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  

 

  那下面书写格式是不是美观、整洁些呢

#div_code img{border:0px;} 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

 

  怎么样是否觉得下面的”清新脱俗“,眼前一亮啊,呵呵,不是在说美女啊。看看我以前一个同事写的吧,我只截取了一部分。

赏心悦目!SQL Server漂亮脚本书写格式

 

  写着觉得有点天马行空、不着边际了,其实这个话题有点大,而且和个人习惯、审美观有莫大联系,所谓众口难调,不过有几点应该是一致的:

  1:书写脚本的时候,多用空格、Tab键,不要让代码拥挤,杂糅在一起。

  2:让代码看起来觉得舒服,一目了然,不要一看就觉得头痛,要细细看上好久,才了解逻辑结构

  3:让代码看起来整洁、优美。凌乱不堪是大忌。

  4:总结、学习一些书写漂亮的格式。

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

#div_code img{border:0px;} -- 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;'




 

#div_code img{border:0px;} 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);