<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]
本文“<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本篇来聊聊若何书写漂亮、整洁、文雅的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脚本?
链接:http://www.cnblogs.com/kerrycode/archive/2010/08/16/1800334.html
<以上是“<b>DBA!你也能写出文雅的SQL脚本</b>[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |