代码改变世界

随笔分类 -  00.SQL Server 设计开发

SQL Server 进制转换函数

2014-09-29 21:30 by 听风吹雨, 37853 阅读, 收藏, 编辑
摘要: 一、背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下面的映射表“: 二、十进制转换为十六进制 在网上有很多资料关于使用SQL语句把十进制转换为十六进制的资料,比如: --方式1 SELECT CONVERT(VARBINARY(50), 23785) 执行返回值为0x00005CE9,但是需要注意的是,这本应该返回二进制的 阅读全文

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

2014-05-26 16:09 by 听风吹雨, 83323 阅读, 收藏, 编辑
摘要: 其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把表、分组字段、行转列字段、值这四个行转列固定需要的值变成真正意义的参数化,大家只需要根据自己的环境,设置参数值,马上就能看到效果了(可以直接跳转至:“参数化动态PIVOT行转列”查看具体的脚本代码)。行转列的效果图如图1所示: 阅读全文

SQL Server 设计开发系列(文章索引)

2011-08-29 15:47 by 听风吹雨, 3768 阅读, 收藏, 编辑
摘要: 一.前言(Introduction)数据库的设计与开发包括了很多东西,也许就是一个设计思想:比如空间换时间方案,读写分离,水平切分表,HA群集等;开发方面就包括脚本的开发、扩展函数,涉及到一些SQL的使用。 该系列还在完善中,欢迎大家指出还缺少些什么内容的维护,我会在后面的文章中陆续补充的。二.系列文章索引(Catalog)SQL Server数据库帐号密码安全设计简单实用SQL脚本简单实用SQL脚本Part2:日期和时间函数简单实用SQL脚本Part:游标模板简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录简单实用SQL脚本Part:生成站点导航树形结构简单实用SQ 阅读全文

SQL Server datetime数据类型设计、优化误区

2010-11-26 10:58 by 听风吹雨, 19055 阅读, 收藏, 编辑
摘要: 一、场景在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你看到表的记录如下图所示,你最先想到的是什么呢?(图1:数据列表)你看到这些数据,是不是觉得这样的设计既浪费了存储空间,又使得这个列的索引增大,查询起来更慢,你也想使用一些其它的数据类型来代替这个datetime吧? 其实大家都是这么想的,这个方向是100%正确的,但是在写这篇文章以前,我进入了两个误区:(如果你中了下面的两个误区,那么请你看看这篇文章吧。)误区一: 把Dates字段的datetime数据类型换成smalldatetime,这样数据就由:‘200 阅读全文

简单实用SQL脚本Part:sql多行转为一列的合并问题

2010-10-20 09:41 by 听风吹雨, 7303 阅读, 收藏, 编辑
摘要: 一、数据库SQL Server列值链式合并需求:原始表的数据的结构如图1所示,把相同guid的code值生成一个链式字符串。(图1)目标:我们希望达到的效果如图2所示,这里的guid变成唯一的了,这行的记录中包含了这个guid所对应的code字段值的链式字符串。(图2)分析与实现:要实现图1到图2的转变,这使用SQL Server 2005的新功能:XML,下面我们来讲讲具体的实现:1. 首先我们先创建一个测试表,方便后面的效果展现;Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHi 阅读全文

简单实用SQL脚本Part:生成站点导航树形结构

2010-09-16 22:30 by 听风吹雨, 4200 阅读, 收藏, 编辑
摘要: 一、需求我们通常的时候,都是先有站点地图,之后对URL的地址进行判断和导航的,那么我们是否可以根据所有收集到的URL来进行分解,从而生成出所有可能的地址,最主要的是要有一个层级的关系。我们的数据一般都是如下图1所示的格式,那么我们如何在页面上展现出图2的效果呢?(图1:原始表)(图2:页面效果图) 其实就普通树形来说,ID与ParentID这两个字段是少不了的。(图3:数据效果图)二、逻辑分析1. 使用字符串分割法 阅读全文

简单实用SQL脚本Part9:纵向回填信息

2010-09-06 14:35 by 听风吹雨, 2915 阅读, 收藏, 编辑
摘要: 需求:我们的一个系统有这样一个功能:记录用户访问网站页面的轨迹,比如A->B->C->D(A、B、C、D表示不同的页面URL),在系统的业务上用户可以使用帐号访问网站,也可以使用匿名访问网站,而用户使用的机器已经被标识为一个GUID,所以当用户使用了匿名访问A、B页面后在C页面使用帐号登陆了系统,那么为了对用户进行分析,我们需要把A、B页面的登录名设置登陆的账号,这样用户的访问过程就有了一个完整的一条线。(如图1所示) 注意1:的是一台机器(GUID)有可能使用了多个帐号进行登陆,那么同一个GUID就有可能包含了匿名、帐号a、帐号b的交替记录。(如图1所示) 注意2:这个表中 阅读全文

简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录

2010-08-30 20:11 by 听风吹雨, 11409 阅读, 收藏, 编辑
摘要: 在很多的时候,我们会在数据库的表中设置一个字段:ID,这个ID是一个IDENTITY,也就是说这是一个自增ID。当并发量很大并且这个字段不是主键的时候,就有可能会让这个值重复;或者在某些情况(例如插入数据的时候出错,或者是用户使用了Delete删除了记录)下会让ID值不是连续的,比如1,2,3,5,6,7,10,那么在中间就断了几个数据,那么我们希望能在数据中找出这些相关的记录,我希望找出的记录是3,5,7,10,通过这些记录可以查看这些记录的规律来分析或者统计;又或者我需要知道那些ID值是没有的:4,8,9。 解决办法的核心思想是: 获取到当前记录的下一条记录的ID值,再判断这两个ID值.. 阅读全文

简单实用SQL脚本Part6:特殊需要的行转列

2010-08-12 22:51 by 听风吹雨, 3767 阅读, 收藏, 编辑
摘要: 一.数据库SQL Server 行转列(Row To Column)(一)需求 原始表的数据的结构如图1所示,把相同的guid的code值转换为列值。(图1)(二)目标 我们希望达到的效果如图2所示,这里的guid变成唯一的了,这行的记录中包含了这个guid所对应的code字段值。(图2)(三)分析与实现 要实现图1到图2的转变,这就是所谓的行转列,下面我们来讲讲具体的实现:1.首先我们先创建一个测试表,方便后面的效果展现;Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHigh... 阅读全文

简单实用SQL脚本Part2:日期和时间函数

2010-04-21 18:25 by 听风吹雨, 2913 阅读, 收藏, 编辑
摘要: 一、SQL Server 日期函数集合Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->--参考http://msdn.microsoft.com/zh-cn/library/ms186724.aspx--1:获取系统日期和时间值函数--getdate()SELECTGETDATE()AS'today'--getutcdate()SELECTGETUTCDATE()AS'today'--2:修改日期和时间值函数- 阅读全文

使用Excel批量生成SQL脚本(小技巧)

2010-04-15 14:18 by 听风吹雨, 26264 阅读, 收藏, 编辑
摘要: 需求: 我们需要把Excel中的一些资料更新到数据库表中,比如学生的考试系统,在数据中已经有了考生的ID,这里有一份考生ID和考生成绩的Excel表,我们如何把考生成绩更新到数据库表中呢?方案:我们最常使用的做法就是把这个Excel表导入到数据库中,在使用update语句来更新表。没错,这就是我通常使用的方法,但是有些人他们不安常理出牌,有时候客户说:我只会执行SQL,我不知道怎么把Excel导入到数据库中。这个时候我们如何把要更新的内容生产SQL语句给到客户呢?如何是一两条记录,我们手动写SQL就可以了,但是如果有几百个学生,我们要手动写几百条语句吗?是否有批量生成SQL脚本的方法?这就是. 阅读全文

简单实用SQL脚本

2010-04-09 18:32 by 听风吹雨, 46886 阅读, 收藏, 编辑
摘要: 行列互转Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ createtabletest(idint,namevarchar(20),quarterint,profileint)insertintotestvalues(1,'a',1,1000) insertintotestvalues(1,'a',2,2000)insertintotestvalues(1,'a',3,4000)insertint 阅读全文