代码改变世界

随笔分类 -  [04]数据库

一个ORM的实现(附源代码)

2014-07-30 23:31 by Mike.Jiang, 8313 阅读, 收藏, 编辑
摘要: 1 前言经过一段时间的编写,终于有出来一个稳定的版本,期间考虑了多种解决方案也偷偷学了下园子里面大神们的作品。已经有很多的ORM框架,为什么要自己实现一个?我的原因是在遇到特殊需求时,可以在ORM中加入特定的代码。如 :根据数据库的字段长度和可空性做基本的数据验证,在ORM中解决数据修改时的同步问... 阅读全文

用T4 Template生成代码

2014-07-15 20:43 by Mike.Jiang, 13977 阅读, 收藏, 编辑
摘要: 1 T4语法T4的语法与ASP.NET的方式比较类似。主要包括指令、文本块、控制块。1.1 指令指令主要包括template, output, assembly, import, include等类型,用以告诉T4引擎如何编译和运行一个模板。这些指令相当于T4引擎的配置参数。示例:告诉T4引擎控... 阅读全文

SQL 常用操作

2013-03-27 16:05 by Mike.Jiang, 439 阅读, 收藏, 编辑
摘要: 1 SELECT COUNT(*)与SELECT COUNT(column_or_expression)的区别SELECT COUNT(*):包括 NULL值;SELECT COUNT(column_or_expression):不包括NULL值;如果这两个都可以满足一需求时,并且在column上无... 阅读全文

Powerdesigner与数据库同步(比较新旧数据库的架构)

2013-02-27 22:58 by Mike.Jiang, 7531 阅读, 收藏, 编辑
摘要: 1概述在使用PowerDesigner进行数据库设计、生成数据库,并开发进行一段时间后, 在这段时间内,数据库的结构必然会有一些变化。我们往往会遇到这样的问题,PowerDesigner与现有数据库结构不匹配。如果人工的比较,即费时又会出错。2 PowerDesigner 生成数据库由于人工比较的缺陷,我们需要一个工具来解决。首先,因为PowerDesigner文件与数据库文件是完全不同的两种文件格式,所以我们先要将它们转换成同样的数据结构。我们用PowerDesigner的物理模型生成一个新的数据库。以生成SQL SERVER 为例:2.1 “Database”->”Generate 阅读全文

SQL JOIN-Hash Join

2012-10-25 23:53 by Mike.Jiang, 2259 阅读, 收藏, 编辑
摘要: 1概述hash join 在特性与merge join相同,都需要一个等值条件。当在连接条上无法命中索引,或大集合的Join, nested join和 merge join可能就无法得到很好的性能,这时我们就需要考虑用hash join.2基本算法Hash join 分为两个阶段,build和probe。在build阶段,会将其中一个集合作为build set,然后hash build table在连接条件上的列,并将结果存储在内存中的(命名为build hash table). 在probe阶段(将第二个集合命名为probe set),每一行hash probe set在连接条件上的列,然 阅读全文

SQL好习惯:编写支持可搜索的SQL

2012-08-31 08:26 by Mike.Jiang, 1193 阅读, 收藏, 编辑
摘要: 1 概述最近维护系统时,客户经常反馈这样一个内容:要在查询列表上加上一个查询条件。这样的要求一点也不过分,并且看起来工作量也不大,不就是加一个WHERE条件嘛,但是当调试到DAL层时,立刻石化——遇到在SELECT子句中编写子查询的SQL,SELECT SO.order_no,(SELECT SUM(SOD.good_num) FROM [StockOrderDetails] AS SOD WHERE SOD.order_id=SO.id) AS order_numFROM [StockOrder] AS SO 这样的写法缺点如下:1>order_num不能在SELECT中继续使用2&g 阅读全文

SQL JOIN --Merge Join

2012-08-27 16:36 by Mike.Jiang, 7948 阅读, 收藏, 编辑
摘要: 1概述Merge join 合并连接。两个集合进行merge join,需要有一个等值的条件,然后需要两个已排序好的集合。2 one-to-many与many-to-many2.1 One-to-many当参与merge join的两个集合中,其中一个集合在等值条件上是具有唯一性(如SELECT * FROM T1 INNER JOIN T2 ON T1.A=T2.B,如果T1在A列上具有唯一性),那么即为one-to-many。主要步骤为:首先从两个集合中各取出一条记录进行比较,如果符合join条件,那么取出该行;否则将值小记录从集合中移除,然后取值小集合的下一行,继续比较。2.2 many 阅读全文

SQL JOIN--Nested Join

2012-08-14 23:48 by Mike.Jiang, 3060 阅读, 收藏, 编辑
摘要: 概述数据库主要有三种物理连接方式:nested join, merge join ,hash join。 这次主要说说nested join(NL).在NL中,两个相连的集合分别是outertable,innertable.SELECT * FROM OrderDetails AS OD INNER JOIN [Order] AS O ON OD.order_id=O.id其中,Order表为outertable,OrderDetaiils 表为innertable.但数据库优化器会选择较小的表作为outertable简单算法描述首先,outertable中取出一行,然后分别与innertab 阅读全文

SQL参数化查询的另一个理由——命中执行计划

2012-08-02 21:55 by Mike.Jiang, 1881 阅读, 收藏, 编辑
摘要: 1概述 SQL语言的本质就是一串伪代码,表达的是做什么,而不是怎么做的意思。如其它语言一样,SQL语句需要编译之后才能运行,所以每一条SQL是需要通过编译器解释才能运行的(在这之间还要做SQL的优化)。而这些步骤都是需要运行成本,所以在数据库中有一个叫做执行计划的东西,编译器会将编译过后的SQL存入执行计划当中,当遇到同样的SQL时,就直接调用执行计划来执行,而不需要再次编译。 通过对上面执行计划的认识,为了提高数据库运行的效率,我们需要尽可能的命中执行计划,这样就可以节省运行时间。2相关SQL2.1查看当前数据库中所有的执行计划:View Code SELECT cp.usecounts . 阅读全文

一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)

2012-07-19 01:20 by Mike.Jiang, 4192 阅读, 收藏, 编辑
摘要: 背景:在做项目时,经常会遇到这样的表结构在主表的中有一列保存的是用逗号隔开ID。如,当一个员工从属多个部门时、当一个项目从属多个城市时、当一个设备从属多个项目时,很多人都会在员工表中加入一个deptIds VARCHAR(1000)列(本文以员工从属多个部门为例),用以保存部门编号列表(很明显这不符合第一范式,但很多人这样设计了,在这篇文章中我们暂不讨论在这种应用场景下,如此设计的对与错,有兴趣的可以在回复中聊聊),然后我们在查询列表中需要看到这个员工从属哪些部门。初始化数据:部门表、员工表数据:View Code IF EXISTS (SELECT * FROM sys.objects W. 阅读全文

SQL 判断两个时间段是否有交叉

2012-07-18 11:19 by Mike.Jiang, 6018 阅读, 收藏, 编辑
摘要: 费话不说,直接上代码SQL 代码:View Code IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fun_GetTimeSlotDays]'))DROP FUNCTION [dbo].fun_GetTimeSlotDaysGO-- =============================================-- Author: <Mike.Jiang>-- Create date: <2012-07-18>-- Description: 阅读全文

SQL PIVOT

2012-07-11 14:42 by Mike.Jiang, 669 阅读, 收藏, 编辑
摘要: 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。示例源数据DaysToManufactureAverageCost05.08851223.882359.10824949.4105使用pivot行转列以得到以下的数据:Cost_Sorted_By_Production_Days01234AverageCost5.0885223.88359.1082NULL949. 阅读全文

CROSS JOIN

2012-07-02 22:38 by Mike.Jiang, 2193 阅读, 收藏, 编辑
摘要: 一,背景:网上找关于查看SQL执行计划的SQL时,发现这样一条SQL:SELECT cp.usecounts as '使用次数' ,objtype as '类型' ,st.text FROM sys.dm_exec_cached_plans cpCROSS APPLY sys.dm_exec_sql_text(plan_handle) AS stWHERE st.text not like '%sys%' 这句SQL(’ CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st')神... 阅读全文

代码调用存储过程超时,SQL Server Management Studio里运行很快 (改进)

2012-05-17 16:42 by Mike.Jiang, 5634 阅读, 收藏, 编辑
摘要: 原文:http://blog.csdn.net/iwteih/article/details/4515267今天同事用代码调用存储过程时超时,在SQL Server Management Studio里运行却很快就有结果,这和我上次遇到的情况一下,现在将解决方案记录如下,谨为大家作一提醒。 解决方案就是: 把存储过程中多余的空格删掉。 瞠目吧结舌吧,不过这就是现实,现实是残酷的,现实是无情的,哈哈 不一定是哪个空格就引起了超时,试着看吧上面的解决方案是将存储过程里的空格去掉,但如果这样,存储过程的格式就不是很友好后期维护也是很麻烦。痛定思痛,于是乎有了下面的解决方案:即然是在数据库里执行成功, 阅读全文

SQL模拟padding函数

2012-03-19 19:30 by Mike.Jiang, 507 阅读, 收藏, 编辑
摘要: 在程序中生成流水号时,通常需要用程序语言中的padding函数用0填充不足位;但是在SQL SERVER中,却没有此方法。可以用以下方法替代,以下是生成5位流水号:SELECT replace(str(1,5),' ','0') -- Outputs '00001'SELECT replace(str(123,5),' ','0') -- Outputs '00123'SELECT replace(str(12345,5),' ','0') -- Outputs &# 阅读全文