<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    如何書寫優雅、漂亮的SQL腳本?

    本篇來聊聊如何書寫漂亮、整潔、優雅的SQL腳本,下面這些是我個人總結、整理出來的。姑且做個拋磚引玉吧,呵呵,歡迎大家一起來討論。

      我們首先來看看一段創建數據表的腳本(如下所示),你是否覺得有什么不妥或是不足呢?如果是你,你怎樣書寫呢?

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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])
    )

      可能你也沒有覺得它有什么不妥,因為你一直都是這樣書寫哦。而且更混亂、更雜的的腳本你也見過,也可能習慣了;那么來看看下面的腳本,

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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

      上面兩段腳本比起來,你是否覺得下面的更美觀、優雅呢?

      接下來我們來看看四段申明變量的腳本,自己可以對比

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->           (一)
    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);          --......
    -------------------------------------------------------------------------------------------------------



    如果是你,你愿意運用哪種書寫格式呢? 個人覺得(一)寫得極極糟糕,不僅閱讀不方便、而且也不方便注視。(二)則是我以前習慣書寫的格式,一來沒有注視、二來看起來沒有(三)、(四)美觀、大方。

      存儲過程、函數頭部注視的樣式(個人曾今用過的樣式):

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->        (一)

    --=============================================================================================================
    --            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=@resourcenameand 
    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)

      動態組合語句是否讓你的腳本看起來林亂不堪啊,你有沒有試過讓其在某些方面看起來美觀點、優雅點啊、

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->'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:總結、學習一些書寫漂亮的格式。

      限于篇幅,下面給出一些我見過的、寫的比較優雅的腳本,大家也可以貼出自己寫得優美的代碼,一起學習探討。

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->-- 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;'

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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);

    posted on 2012-05-29 09:53 順其自然EVO 閱讀(281) 評論(0)  編輯  收藏 所屬分類: 數據庫

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩免费视频播播| 亚洲国产精品久久66| 久久亚洲中文字幕精品一区| 亚洲av永久无码精品网站 | 免费看男女下面日出水视频| 亚洲高清中文字幕| 福利免费在线观看| 免费看AV毛片一区二区三区| 亚洲人成在线免费观看| 久久狠狠躁免费观看2020| 亚洲国产精品综合久久网络| 亚洲精品无码永久在线观看男男| 无码国产精品一区二区免费vr | 亚洲无圣光一区二区| 91精品手机国产免费| 亚洲VA中文字幕无码毛片| 国产精品免费观看久久| 亚洲国产综合人成综合网站00| 免费人成视频在线观看不卡| 国产精品福利在线观看免费不卡 | 亚洲成a人片7777| 亚洲日本韩国在线| 国产高潮流白浆喷水免费A片 | 永久免费不卡在线观看黄网站| 超清首页国产亚洲丝袜| 一个人看的www在线观看免费| 亚洲1区1区3区4区产品乱码芒果| 四虎在线最新永久免费| 亚洲欧洲精品国产区| 免费观看黄网站在线播放| 国产在线观看无码免费视频| 亚洲AV无码专区亚洲AV桃| 国产美女被遭强高潮免费网站| 亚洲av色香蕉一区二区三区| 亚洲视频欧洲视频| 亚洲另类激情综合偷自拍图 | 亚洲综合最新无码专区| 免费无码又爽又刺激高潮| 精品无码免费专区毛片| 日韩电影免费在线观看中文字幕| yellow视频免费看|