当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-01-25 23:11:00  来源:本站整理

<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]

赞助商链接



  本文“<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本篇来聊聊若何书写漂亮、整洁、文雅的SQL脚本,下面这些是我个人总结、整理出来的.姑且做个举一反三吧,呵呵,欢送大家一同来谈论.

我们首先来看看一段成立数据表的脚本(以下所示),你能否认为有什么不当或是不足呢?假如是你,你怎样书写呢?

  1. CREATE TABLE [dbo].[TableDataDictionary](  
  2.     [TableID] [int] IDENTITY(1,1) NOT NULL,  
  3.     [IpAddress] [nvarchar](15) NOT NULL,  
  4.     [DataBaseName] [nvarchar](35) NOT NULL,  
  5.     [TableName] [nvarchar](35) NOT NULL,  
  6.     [Description] [nvarchar](150) NULL,  
  7.  CONSTRAINT [PK_TableDataDictionary] PRIMARY KEY([Tableid])  

大概你也没有认为它有什么不当,因为你一向都是这样书写哦.并且更混乱、更杂的的脚本你也见过,也大概习惯了;那么来看看下面的脚本,

  1. USE [Test];  
  2. GO  
  3.  
  4. IF OBJECT_ID(N'TableDataDictionary'IS NULL   
  5.     CREATE TABLE [dbo].[TableDataDictionary]  
  6.     (  
  7.         [TableID]            INT IDENTITY(1,1)  NOT NULL,  
  8.         [IpAddress]          NVARCHAR(15)       NOT NULL,  
  9.         [DataBaseName]       NVARCHAR(35)       NOT NULL,  
  10.         [TableName]          NVARCHAR(35)       NOT NULL,  
  11.         [Description]        NVARCHAR(150)      NULL,  
  12.         CONSTRAINT [PK_TableDataDictionary] PRIMARY KEY([Tableid])  
  13.     );  
  14. ELSE 
  15.     PRINT 'This table have been exist in database';  
  16. GO 

上面两段脚本比起来,你能否认为下面的更美好、文雅呢?

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

(一)

  1. DECLARE @PayType VARCHAR(50),  @Rate FLOAT, @FeeRate FLOAT ,@OtheFee FLOAT;  
  2. DECLARE @StartDate DATETIME,   @EndDate DATETIME;  
  3. DECLARE @CmdSql NVARCHAR(MAX);  
  4. DECLARE @MyCardBillFee FLOAT, @MyCardFee    FLOAT

---------------------------------------------------------------------------------------------------------

(二)

  1. DECLARE @PayType VARCHAR(50);  
  2. DECLARE @Rate FLOAT;  
  3. DECLARE @FeeRate FLOAT;  
  4. DECLARE @OtheFee FLOAT;  
  5. DECLARE @StartDate DATETIME;  
  6. DECLARE @EndDate DATETIME;  
  7. DECLARE @CmdSql NVARCHAR(MAX);  
  8. DECLARE @MyCardBillFee FLOAT;  
  9. DECLARE @MyCardFee    FLOAT

---------------------------------------------------------------------------------------------------------

(三)

  1. DECLARE @PayType         VARCHAR(50);              --支付范例  
  2. DECLARE @Rate            FLOAT;                    --汇率比例  
  3. DECLARE @FeeRate         FLOAT;                    --手续费比例  
  4. DECLARE @MyCardFee       FLOAT;                    --......  
  5. DECLARE @OtheFee         FLOAT;                    --......  
  6. DECLARE @MyCardBillFee   FLOAT;                    --......  
  7. DECLARE @StartDate       DATETIME;                 --......  
  8. DECLARE @EndDate         DATETIME;                 --......  
  9. DECLARE @CmdSql          NVARCHAR(MAX);            --...... 

--------------------------------------------------------------------------------------------------------

(四)

  1. DECLARE   
  2.     @PayType         AS    VARCHAR(50);            --支付范例  
  3.     @Rate            AS    FLOAT;                  --汇率比例  
  4.     @FeeRate         AS    FLOAT;                  --手续费比例  
  5.     @MyCardFee       AS    FLOAT;                  --......  
  6.     @OtheFee         AS    FLOAT;                  --......  
  7.     @MyCardBillFee   AS    FLOAT;                  --......  
  8.     @StartDate       AS    DATETIME;               --......  
  9.     @EndDate         AS    DATETIME;               --......  
  10.     @CmdSql          AS    NVARCHAR(MAX);          --...... 

-------------------------------------------------------------------------------------------------------

假如是你,你乐意应用哪类书写格局呢? 个人认为(一)写得极极糟糕,不但阅读不便利、并且也不便利凝视.(二)则是我从前习惯书写的格局,一来没有凝视、二来看起来没有(三)、(四)美好、大方.

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

(一)

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

  1. --       Function         :            dbo.USP_GetEmployeById 按Id获得雇员信息  
  2. --       Auhtor            :            Kerry  
  3. --       Create Date       :            2010-08-12  
  4. --       Description       :            具体描写存储历程功效(对Function 功效增补)、以及参数、输出后果的描写 

--======================================================================================
--            2010-08-12        :           改正....增添........
--            2010-08-13        :            改正....增添.......
--=====================================================================================

Function  扼要描写存储历程、函数功效.

Desctiption 具体描写存储历程、函数功效,以及参数、输出后果描写

(二)

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

  1. --        Create Date            :        2010-08-11  
  2. --        Author                 :        Kerry  
  3. --        Modified Date          :        2010-08-12  
  4. --        Modified Content       :        改正表字段、增添汇率计算.....  
  5. --        Modified Date          :        2010-08-13  
  6. --        Modified Content       :        改正表字段、增添汇率计算.....  
  7. --        Description            :        计算抢车位社区游戏的月充值构造信息.     

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

(三)

  1. /**************************************************************************************************************  
  2.         Auhtor                 :            Kerry  
  3.         Create Date            :            2010-08-12  
  4.         Modified Date          :  
  5.         Modified Content       :  
  6.         Description            :            若何书写漂亮、文雅的SQL脚本  
  7. **************************************************************************************************************/ 

( 四)

  1. -- =============================================  
  2. -- Author:        <Author,,Name>  
  3. -- Create date: <Create Date,,>  
  4. -- Description:    <Description,,>  
  5. -- ============================================= 

利用MSSMS新建存储历程,它自动生成的款式

个人认为(一) >= (二) > (三) > (四) ,不知道大家有没有更好的格局举荐.

下面看看这样一段脚本,一眼就认为有点糟糕,其实实际开辟中脚本比这个大概复杂得多,头痛吧

  1. select PermissionID from  Permission where resourceid=  
  2. select top 1 resourceid from [Resource] where resourcename=@resourcename) and   
  3. actionid=(select top 1 actionid from [Actionwhere actionname=@actionname)  
  4. AND SchemaId in (SELECT SchemaId FROM dbo.BindToSchema WHERE DcUserID=@UserID)     

首先就应当统一关键字大小写,不要一部份大写、一部份小写.然后从构造上面调整. 大概每个人的审美好、习惯的格局差别,这个无所谓,也没有必要统一. 但是你书写出来的脚本至少要构造清楚,一目了然.不要让别人费很大的劲去调整格局,然后才能理解它的逻辑,假如写出上面或是比上面更糟糕的脚本,我想项目经理真应当教导教导你.这样只会给后来保护的人痛楚不堪(实际开辟中大概比这糟糕十倍呢,想必很多人是深受其害啊)

  1. SELECT Permission FROM  Permission  
  2.  WHERE   
  3.      resourceid =( SELECT TOP 1 resourceid FROM [Resource] WHERE resourcename=@resourcename)   
  4.     AND actionid =(SELECT TOP 1 actionid FROM [ActionWHERE actionname=@actionname)  
  5.     AND SchemaId IN (SELECT SchemaId FROM dbo.DcUserBindToSchema WHERE DcUserID=@UserID) 

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

  1. 'SELECT   Order_ID = @OrderID, CampaignCode= @CampaignCode, ProductCode = @ProductCode, StartDate= SpotDate,    
  2.    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 ,   
  3.    Plan_Insertion_ID  = Plan_Insertion_ID  

那下面书写格局是不是美好、整洁些呢

  1. SELECT     
  2.   Order_ID          = @OrderID    
  3. , CampaignCode      = @CampaignCode    
  4. , ProductCode       = @ProductCode    
  5. , StartDate         = SpotDate    
  6. , EndDate           = EndDate    
  7. , StartTime         = Media_StartTime    
  8. , EndTime           = Media_EndTime     
  9. , Adformat          = Media_Adformat                                         
  10. , Color             = Media_Color    
  11. , Impression        = Media_Impression                                       
  12. , Location          = Media_Location                                         
  13. , Material          = Media_Material                                         
  14. , Position          = Media_Position                                         
  15. , Program           = Media_Program                                          
  16. , Scale             = Media_Scale         --Media_Showing                                          
  17. Size              = Media_Size                                             
  18. , SpotType          = Media_SpotType                                      
  19. , URL               = Media_URL    
  20. , ScheduleNo        = ScheduleNo    
  21. , Plan_Insertion_ID = Plan_Insertion_ID    
  22. , Position = Media_Position  

怎么样能否认为下面的”清爽脱俗“,眼前一亮啊,呵呵,不是在说美女啊.看看我从前一个同事写的吧,我只截取了一部份.

DBA!你也能写出文雅的SQL脚本

写着认为有点天马行空、不着边际了,其实这个话题有点大,并且和个人习惯、审美好有莫大接洽,所谓众口难调,不过有几点应当是一致的:

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

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

3:让代码看起来整洁、美好.缭乱不堪是大忌.

4:总结、学习一些书写漂亮的格局.

限于篇幅,下面给出一些我见过的、写的对比文雅的脚本,大家也可以贴出自己写得美好的代码,一同学习探究.、

  1. -- Construct column list  
  2. SET @sql =  
  3.   N'SET @result = '                                    + @newline +  
  4.   N'  STUFF('                                          + @newline +  
  5.   N'    (SELECT N'','' + ' 
  6.            + N'QUOTENAME(pivot_col) AS [text()]'       + @newline +  
  7.   N'     FROM (SELECT DISTINCT(' 
  8.            + @on_cols + N') AS pivot_col'              + @newline +  
  9.   N'           FROM' + @query + N') AS DistinctCols'   + @newline +  
  10.   N'     ORDER BY pivot_col'                           + @newline +  
  11.   N'     FOR XML PATH('''')),'                         + @newline +  
  12.   N'    1, 1, N'''');' 
  13.  
  14. EXEC sp_executesql  
  15.   @stmt   = @sql,  
  16.   @params = N'@result AS NVARCHAR(MAX) OUTPUT',  
  17.   @result = @cols OUTPUT;  
  18.  
  19. -- Create the PIVOT query  
  20. SET @sql =  
  21.   N'SELECT *'                                           + @newline +  
  22.   N'FROM'                                               + @newline +  
  23.   N'  ( SELECT '                                        + @newline +  
  24.   N'      ' + @on_rows + N','                           + @newline +  
  25.   N'      ' + @on_cols + N' AS pivot_col,'              + @newline +  
  26.   N'      ' + @agg_col + N' AS agg_col'                 + @newline +  
  27.   N'    FROM '                                          + @newline +  
  28.   N'      ' + @query                                    + @newline +  
  29.   N'  ) AS PivotInput'                                  + @newline +  
  30.   N'  PIVOT'                                            + @newline +  
  31.   N'    ( ' + @agg_func + N'(agg_col)'                  + @newline +  
  32.   N'      FOR pivot_col'                                + @newline +  
  33.   N'        IN(' + @cols + N')'                         + @newline +  
  34.   N'    ) AS PivotOutput;' 

代码

  1. DECLARE 
  2.   @schemaname AS NVARCHAR(128),  
  3.   @tablename  AS NVARCHAR(128),  
  4.   @colname    AS NVARCHAR(128),  
  5.   @sql        AS NVARCHAR(805);  
  6.  
  7. SET @schemaname = N'dbo';  
  8. SET @tablename  = N'Orders';  
  9. SET @colname    = N'CustomerID';  
  10. SET @sql = N'SELECT COUNT(DISTINCT ' 
  11.   + QUOTENAME(@colname) + N') FROM ' 
  12.   + QUOTENAME(@schemaname)  
  13.   + N'.' 
  14.   + QUOTENAME(@tablename)  
  15.   + N';';  
  16.  
  17. EXEC(@sql); 

原文标题:若何书写文雅、漂亮的SQL脚本?

链接:http://www.cnblogs.com/kerrycode/archive/2010/08/16/1800334.html

<
  以上是“<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .