﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-黄小二的讀書筆記-文章分类-[DB]</title><link>http://www.blogjava.net/kiant/category/44901.html</link><description>有才而性缓定属大才，有智而气和斯为大智。人偏狭我受之以宽容，人险仄我持之以坦荡。缓事宜急干，敏则有功；急事宜缓办，忙则多措。
--李叔同</description><language>zh-cn</language><lastBuildDate>Mon, 03 May 2010 02:47:54 GMT</lastBuildDate><pubDate>Mon, 03 May 2010 02:47:54 GMT</pubDate><ttl>60</ttl><item><title>关于在数据库中存储层次数据的一点看法与理解</title><link>http://www.blogjava.net/kiant/articles/319878.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Sun, 02 May 2010 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/319878.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/319878.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/319878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/319878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/319878.html</trackback:ping><description><![CDATA[<p><br />
文章内容引用自：<br />
全面了解数据库设计中分类算法<br />
http://blog.csdn.net/hyzhx/archive/2008/03/21/2201465.aspx<br />
<br />
在数据库中存储层次数据实现无限级分层<br />
http://www.52web.com/52article/?view-250.html<br />
http://www.thinkly.cn/index.php/archives/354<br />
<br />
商品无限分类的算法如何优化?<br />
http://www.javaeye.com/topic/170744<br />
<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于无限分类的设计网上讨论有很多，说白了就是在数据库中设计树的问题，在这里仅对我所知的做些记录与对比。<br />
假设表结构为下图，并且为某表的外键引用。要求：<br />
1、实现无限层次。<br />
2、能找到节点的路径。<br />
3、能找到所有子孙节点集合（获取树）。<br />
<img height="288" alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2010.05/01.jpg" width="262" border="0" /><br />
<em style="font-size: 8pt">引用："在数据库中存储层次数据实现无限级分层"</em><br />
<br />
&nbsp;<br />
<span class="fstrong"><strong>
<hr color="#999999" size="4" />
方案1：邻接列表模型(The Adjacency List Model)/递归方法<br />
</strong>http://www.52web.com/52article/?view-250-page-2.html<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2010.05/02.jpg" border="0" /></span>&nbsp;<br />
<em style="font-size: 8pt">引用："在数据库中存储层次数据实现无限级分层"<br />
</em>
<p>&nbsp;</p>
<p>优点：结构简单明了，对于节点的维护并不需要额外的工作。<br />
缺点：实现要求2、3需要进行大量的递归操作，每一次数据库查询都需要花费一点时间。<br />
&nbsp;</p>
<p><strong>
<hr color="#999999" size="4" />
方案2：递归方法改进</strong><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2010.05/05.jpg" border="0" /><br />
<br />
<p>&nbsp;</p>
<p>对方案1的扩展，新增 path字段以存储节点路径，arrayChild字段存储其下所有节点。</p>
<p>优点：实现要求1、2只需要一次查询。<br />
缺点：当节点发生改变时需要维护对应的字段，且 path与 arrayChild以拼串形式存储于文本字段，容易限制节点长度，并且对于查询效率有影响。</p>
<p>&nbsp;<br />
<strong>
<hr color="#999999" size="4" />
方案3：改进前序遍历树<br />
</strong>http://www.52web.com/52article/?view-250-page-2.html<br />
<img height="194" alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2010.05/03.jpg" width="456" border="0" /><img alt="" src="http://www.blogjava.net/images/blogjava_net/kiant/2010.05/04.jpg" border="0" /><br />
<br />
<br />
如果作为主键标识的节点编号存在外部引用，还需要定义一个链表编号 linkId来确保其主键标识固定，并重新定义其链表左右范围。<br />
<p>&nbsp;</p>
<p>优点：实现要求1、2只需要一次查询，但比方案2维护起来更见方便（减少大量的拼串），而且因为左右值表示的是链表的范围，所以查询效率更高。<br />
缺点：算法未经说明前不如方案1、2直观。&nbsp;</p>
<br />
<br />
<br />
ps:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000"><strong>分类算法要解决的问题&nbsp;<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在网站建设中，分类算法的应用非常的普遍。在设计一个电子商店时，要涉及到商品分类；在设计发布系统时，要涉及到栏目或者频道分类；在设计软件下载这样的程序时，要涉及到软件的分类；如此等等。可以说，分类是一个很普遍的问题。&nbsp;<br />
<br />
我常常面试一些程序员，而且我几乎毫无例外地要问他们一些关于分类算法的问题。下面的举几个我常常询问的问题。你认为你可以很轻松地回答么？&nbsp;<br />
<br />
</span><span style="color: #000000">1</span><span style="color: #000000">、分类算法常常表现为树的表示和遍历问题。那么，请问：如果用数据库中的一个Table来表达树型分类，应该有几个字段？&nbsp;<br />
<br />
</span><span style="color: #000000">2</span><span style="color: #000000">、如何快速地从这个Table恢复出一棵树？&nbsp;<br />
<br />
</span><span style="color: #000000">3</span><span style="color: #000000">、如何判断某个分类是否是另一个分类的子类？&nbsp;<br />
<br />
</span><span style="color: #000000">4</span><span style="color: #000000">、如何查找某个分类的所有产品？&nbsp;<br />
<br />
</span><span style="color: #000000">5</span><span style="color: #000000">、如何生成分类所在的路径。&nbsp;<br />
<br />
</span><span style="color: #000000">6</span><span style="color: #000000">、如何新增分类？&nbsp;<br />
<br />
在不限制分类的级数和每级分类的个数时，这些问题并不是可以轻松回答的。本文试图解决这些问题。<br />
</span></div>
<img src ="http://www.blogjava.net/kiant/aggbug/319878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2010-05-02 10:48 <a href="http://www.blogjava.net/kiant/articles/319878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于主键 IDENTITY 和 uniqueidentifier 的笔记</title><link>http://www.blogjava.net/kiant/articles/318833.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 20 Apr 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/318833.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/318833.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/318833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/318833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/318833.html</trackback:ping><description><![CDATA[<br />
推荐文章：<br />
http://tech.ddvip.com/2008-10/122517676785777_4.html<br />
<br />
使用GUID作为数据库主键的测试<br />
http://www.cnblogs.com/chiname/articles/227584.html<br />
<br />
<br />
<hr />
<strong>使用uniqueidentifier还是IDENTITY生成主键？<br />
</strong><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">　　问题&nbsp;<br />
<br />
　　我正在设计一张表，并且决定创建一个自动生成主键值而不是创建自己的模式或者使用自然键。我知道SQL&nbsp;Server提供了全球唯一识别码(GUID)，也提供了创建这些值的标识符。请问这些方法有哪些优缺点呢</span><span style="color: #000000">?</span><span style="color: #000000"><br />
<br />
　　专家解答<br />
<br />
　　确实，你可以通过很多种方法来为你的表自动生成主键值。最常见的一种方法是通过使用IDENTITY字段属性，或者指定带有默认NEWID()&nbsp;或NEWSEQUENTIALID()函数的唯一识别码数据类型。此外，<span style="color: red">在SQL&nbsp;Server复制中，全球唯一识别码经常被用在带有更新订阅的合并复制或者事务复制的唯一识别符行中</span>。<br />
<br />
<br />
<br />
　　NEWID()和NEWSEQUENTIALID()有什么区别呢</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;NEWID()随机生成一个基于服务器网卡的标识符号码和CPU块唯一号码的保证的唯一值。与此相反，NEWSEQUENTIALID()按照顺序生成这些值而不是随机生成。<br />
<br />
　　正如你看到的，<span style="color: red">第一张表使用NEWID()生成随机值而第二张表使用NEWSEQUENTIALID()生成有顺序的值。由于没有通过IDENTITY方法生成整数，生成的全球唯一识别码值看起来在工作中不易于使用。这是另一个要注意的地方</span>。SQL&nbsp;Server在内存中保存最后一个生成的标识值，这样可以在通过使用SCOPE_IDENTITY()，@@IDENTITY或者CHECK_IDENT(取决于你要求的范围)的INSERT语句之后，重新找到这个标识值。这与获得最后一个全球唯一标识符值没有任何相似之处。<span style="color: red">如果你使用一个全球唯一标识符，你必须创建自己的机制来获得最后一个插入值(比如，在插入之前重新找到全球唯一标识符或者使用SQL&nbsp;Server&nbsp;2005&nbsp;OUTPUT从句)</span></span><span style="color: #000000">。<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;存储效果<br />
<br />
　　根据输出结果，你可以看到NEWID()测试表是成碎片的，因为它的碎片比例是98</span><span style="color: #000000">%</span><span style="color: #000000">。此外，你可以看到这些行分散在490页中。这是因为生成主键的随机属性导致了页拆分。与此相反，IDENTITY&nbsp;和NEWSEQUENTIALID()测试表只有极小的碎片比例，这是因为它们按照特定顺序自动生成键。结果使它们免受页拆分之苦，而使用NEWID()方法具有页拆分的困扰。尽管你可以用磁盘碎片整理程序处理NEWID()表，但是主键产生的随机属性仍然会由于将来对表做插入操作而引起页拆分和碎片。尽管如此，页拆分仍然可以通过指定恰当的FILL&nbsp;FACTOR而减到最小。<br />
<br />
　　现在也来考虑这个问题，因为唯一标识符数据类型消耗16字节的数据，任何在一张表中使用一个全球唯一识别码作为聚集索引的定义非聚集索引大小都会受到影响，因为这些非聚集索引的叶级别包含作为指示器的聚集索引键。因此，如果一个IDENTITY被定义为整数或者bigint数据类型，那么任何非聚集索引的大小可能会因为比较大而终止。<br />
<br />
<br />
　　很明显，使用IDENTITY来自动生成键值比使用全球唯一标识符方法更具有<span style="color: #3366ff">优势：<br />
<br />
　　l&nbsp;IDENTITY生成值是可以配置的，并且易于阅读，易于在工作中使用。<br />
<br />
　　l&nbsp;可以使用更少的数据库页来满足查询请求。<br />
<br />
　　l&nbsp;与NEWID()方法相比，它在页拆分(与前面相关)方面的担忧可以消除。<br />
<br />
　　l&nbsp;数据库规模最小化。<br />
<br />
　　l&nbsp;存在系统函数来获得最后生成的IDENTITY值(比如SCOPE_IDENTITY()等)<br />
<br />
　　一些系统函数，比如MIN()和MAX()，不能在唯一标识符字段中使用。</span></span></div>
<br />
<br />
<hr />
<strong>使用GUID作为数据库主键的测试</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">可以看出在以GUID作为主键的表中加一个时间类型或是Int类型的索引可以弥补以GUID作为主键带来的性能损失。<br />
<br />
</span><span style="color: #000000">3</span><span style="color: #000000">、这样做是为了模拟现实使用情况，当然这样很片面，因为在平时使用过程中，经常用到分页，计算数据总数，目的是看看在如果在表中不另外加索引会不会影响计算效率，看来用GUID作为主键必须要另外加索引才能保证入count这样的计算不至于消耗太多时间，但是用int类型好像就不会消耗太多时间的，所以这样一比较就看出，<span style="color: #ff0000">如果用varchar字段类型做主键的表，表内一定需要个非聚集索引</span>。&nbsp;</span></div>
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/318833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2010-04-20 11:52 <a href="http://www.blogjava.net/kiant/articles/318833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 详细讲解提高数据库查询效率的实用方法</title><link>http://www.blogjava.net/kiant/articles/226717.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Wed, 03 Sep 2008 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226717.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226717.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226717.html</trackback:ping><description><![CDATA[原文转自：&nbsp; <a href="http://tech.c114.net/501/a267960.html" target="_blank">http://tech.c114.net/501/a267960.html</a><br />
<br />
<br />
<p>1.对查询进行优化，应尽量避免全表扫描，首先应考虑在 where 及 order by 涉及的列上建立索引。 <br />
</p>
<p><br />
<br />
2.应尽量避免在 where 子句中对字段进行 null 值判断，否则将导致引擎放弃使用索引而进行全表扫描，如： <br />
select id from t where num is null </p>
<p>可以在num上设置默认值0，确保表中num列没有null值，然后这样查询： <br />
select id from t where num=0 </p>
<p><br />
<br />
3.应尽量避免在 where 子句中使用!=或&lt;&gt;操作符，否则将引擎放弃使用索引而进行全表扫描。 </p>
<p><br />
<br />
4.应尽量避免在 where 子句中使用 or 来连接条件，否则将导致引擎放弃使用索引而进行全表扫描，如： <br />
select id from t where num=10 or num=20 </p>
<p>可以这样查询： <br />
select id from t where num=10 <br />
union all <br />
select id from t where num=20 </p>
<p><br />
<br />
5.in 和 not in 也要慎用，否则会导致全表扫描，如： <br />
select id from t where num in(1,2,3) </p>
<p>对于连续的数值，能用 between 就不要用 in 了： <br />
select id from t where num between 1 and 3 </p>
<p><br />
<br />
6.下面的查询也将导致全表扫描： <br />
select id from t where name like '%abc%' </p>
<p>若要提高效率，可以考虑全文检索。 </p>
<p><br />
<br />
7.如果在 where 子句中使用参数，也会导致全表扫描。因为SQL只有在运行时才会解析局部变量，但优化程序不能将访问计划的选择推迟到运行时；它必须在编译时进行选择。然而，如果在编译时建立访问计划，变量的值还是未知的，因而无法作为索引选择的输入项。如下面语句将进行全表扫描： <br />
select id from t where num=@num </p>
<p>可以改为强制查询使用索引： <br />
select id from t with(index(索引名)) where num=@num </p>
<p><br />
<br />
8.应尽量避免在 where 子句中对字段进行表达式操作，这将导致引擎放弃使用索引而进行全表扫描。如： <br />
select id from t where num/2=100 </p>
<p>应改为: <br />
select id from t where num=100*2 </p>
<p><br />
<br />
9.应尽量避免在where子句中对字段进行函数操作，这将导致引擎放弃使用索引而进行全表扫描。如： <br />
select id from t where substring(name,1,3)='abc'--name以abc开头的id <br />
select id from t where datediff(day,createdate,'2005-11-30')=0--&#8216;2005-11-30&#8217;生成的id </p>
<p>应改为: <br />
select id from t where name like 'abc%' <br />
select id from t where createdate&gt;='2005-11-30' and createdate&lt;'2005-12-1' </p>
<p><br />
<br />
10.不要在 where 子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。 </p>
<p><br />
<br />
11.在使用索引字段作为条件时，如果该索引是复合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用，并且应尽可能的让字段顺序与索引顺序相一致。 </p>
<p><br />
<br />
12.不要写一些没有意义的查询，如需要生成一个空表结构： <br />
select col1,col2 into #t from t where 1=0 </p>
<p>这类代码不会返回任何结果集，但是会消耗系统资源的，应改成这样： <br />
create table #t(...) </p>
<p><br />
<br />
13.很多时候用 exists 代替 in 是一个好的选择： <br />
select num from a where num in(select num from b) </p>
<p>用下面的语句替换： <br />
select num from a where exists(select 1 from b where num=a.num) </p>
<p><br />
<br />
14.并不是所有索引对查询都有效，SQL是根据表中数据来进行查询优化的，当索引列有大量数据重复时，SQL查询可能不会去利用索引，如一表中有字段sex，male、female几乎各一半，那么即使在sex上建了索引也对查询效率起不了作用。 </p>
<p><br />
<br />
15.索引并不是越多越好，索引固然可以提高相应的 select 的效率，但同时也降低了 insert 及 update 的效率，因为 insert 或 update 时有可能会重建索引，所以怎样建索引需要慎重考虑，视具体情况而定。一个表的索引数最好不要超过6个，若太多则应考虑一些不常使用到的列上建的索引是否有必要。 </p>
<p><br />
<br />
16.应尽可能的避免更新 clustered 索引数据列，因为 clustered 索引数据列的顺序就是表记录的物理存储顺序，一旦该列值改变将导致整个表记录的顺序的调整，会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列，那么需要考虑是否应将该索引建为 clustered 索引。 </p>
<p><br />
<br />
17.尽量使用数字型字段，若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。 </p>
<p><br />
<br />
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ，因为首先变长字段存储空间小，可以节省存储空间，其次对于查询来说，在一个相对较小的字段内搜索效率显然要高些。 </p>
<p><br />
<br />
19.任何地方都不要使用 select * from t ，用具体的字段列表代替&#8220;*&#8221;，不要返回用不到的任何字段。 </p>
<p><br />
<br />
20.尽量使用表变量来代替临时表。如果表变量包含大量数据，请注意索引非常有限（只有主键索引）。 </p>
<p><br />
<br />
21.避免频繁创建和删除临时表，以减少系统表资源的消耗。 </p>
<p><br />
<br />
22.临时表并不是不可使用，适当地使用它们可以使某些例程更有效，例如，当需要重复引用大型表或常用表中的某个数据集时。但是，对于一次性事件，最好使用导出表。 </p>
<p><br />
<br />
23.在新建临时表时，如果一次性插入数据量很大，那么可以使用 select into 代替 create table，避免造成大量 log ，以提高速度；如果数据量不大，为了缓和系统表的资源，应先create table，然后insert。 </p>
<p><br />
<br />
24.如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先 truncate table ，然后 drop table ，这样可以避免系统表的较长时间锁定。 </p>
<p><br />
<br />
25.尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该考虑改写。 </p>
<p><br />
<br />
26.使用基于游标的方法或临时表方法之前，应先寻找基于集的解决方案来解决问题，基于集的方法通常更有效。 </p>
<p><br />
<br />
27.与临时表一样，游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法，尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括&#8220;合计&#8221;的例程通常要比使用游标执行的速度快。如果开发时间允许，基于游标的方法和基于集的方法都可以尝试一下，看哪一种方法的效果更好。 </p>
<p><br />
<br />
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ，在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。 </p>
<p><br />
<br />
29.尽量避免大事务操作，提高系统并发能力。 </p>
<p><br />
<br />
30.尽量避免向客户端返回大数据量，若数据量过大，应该考虑相应需求是否合理。 </p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/kiant/aggbug/226717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-03 17:08 <a href="http://www.blogjava.net/kiant/articles/226717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] SQL编码规范(收集) &amp; 数据库设计经验谈(转)</title><link>http://www.blogjava.net/kiant/articles/226459.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Tue, 02 Sep 2008 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/226459.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/226459.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/226459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/226459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/226459.html</trackback:ping><description><![CDATA[原文转自：<br />
<a href="http://www.cnblogs.com/Duiker/archive/2006/12/10/587764.html" target="_blank">数据库设计经验谈(转) <br />
</a>SQL编码规范(收集)&nbsp;&nbsp; <a href="http://hi.baidu.com/rambochow/blog/item/3ebcbb3db3758903bba16743.html" target="_blank">http://hi.baidu.com/rambochow/blog/item/3ebcbb3db3758903bba16743.html</a><br />
<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_175854" onclick="this.style.display='none'; Code_Closed_Text_175854.style.display='none'; Code_Open_Image_175854.style.display='inline'; Code_Open_Text_175854.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_175854" style="display: none" onclick="this.style.display='none'; Code_Open_Text_175854.style.display='none'; Code_Closed_Image_175854.style.display='inline'; Code_Closed_Text_175854.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_175854" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">1.书写格式&nbsp; </span><span id="Code_Open_Text_175854" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">.书写格式　<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;示例代码：　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;存储过程SQL文书写格式例<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;c.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #ff00ff">round</span><span style="color: #000000">(</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(c.submitSubletAmountDLR&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;c.submitPartsAmountDLR&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;c.submitLaborAmountDLR)&nbsp;</span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">),&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">avg</span><span style="color: #000000">,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;decode(</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">x</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">xx</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">CNY</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitSubletAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitPartsAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;a.submitLaborAmountDLR<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;SRV_TWC_F&nbsp;a<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;(to_char(a.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(start)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;to_char(a.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(end)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;nvl(a.deleteflag,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">union</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">all</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.dealerCode,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitSubletAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitPartsAmountDLR,<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;b.submitLaborAmountDLR<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;SRV_TWCHistory_F&nbsp;b<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;(to_char(b.ORIGSUBMITTIME,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(start)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;to_char(b.ORIGSUBMITTIME,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">yyyy/mm/dd</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">Date&nbsp;Range(end)</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;nvl(b.deleteflag,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;)&nbsp;c<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;c.dealerCode<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">avg</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">desc</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;C#中里的SQL字符串书写格式例<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;strSQL&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">insert</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">into</span><span style="color: #000000">&nbsp;Snd_FinanceHistory_Tb&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"(DEALERCODE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"REQUESTSEQUECE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"HANDLETIME,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"JOBFLAG,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"FRAMENO,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"INMONEY,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"REMAINMONEY,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"DELETEFLAG,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"UPDATECOUNT,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"CREUSER,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"CREDATE,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"HONORCHECKNO,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"SEQ)&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #0000ff">values</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.dealerCode&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.requestsequece&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"sysdate,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">07</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;frameNO&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;requestMoney&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;",&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;remainMoney&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;",&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftStruct.employeeCode&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"sysdate,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #ff0000">"&nbsp;+&nbsp;draftInputDetail.honorCheckNo&nbsp;+&nbsp;"</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">index</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;")";<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">).缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;对于存储过程文件，缩进为8个空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;对于C#里的SQL字符串，不可有缩进，即每一行字符串不可以空格开头<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">).换行<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #808080">&gt;</span><span style="color: #000000">.</span><span style="color: #0000ff">Select</span><span style="color: #808080">/</span><span style="color: #0000ff">From</span><span style="color: #808080">/</span><span style="color: #0000ff">Where</span><span style="color: #808080">/</span><span style="color: #0000ff">Order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #808080">/</span><span style="color: #0000ff">Group</span><span style="color: #000000">&nbsp;by等子句必须另其一行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Select子句内容如果只有一项，与Select同行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Select子句内容如果多于一项，每一项单独占一行，在对应Select的基础上向右缩进8个空格（C#无缩进）<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #808080">&gt;</span><span style="color: #000000">.From子句内容如果只有一项，与From同行写<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">5</span><span style="color: #808080">&gt;</span><span style="color: #000000">.From子句内容如果多于一项，每一项单独占一行，在对应From的基础上向右缩进8个空格（C#无缩进）<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">6</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Where子句的条件如果有多项，每一个条件占一行，以AND开头，且无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">7</span><span style="color: #808080">&gt;</span><span style="color: #000000">.(</span><span style="color: #0000ff">Update</span><span style="color: #000000">)Set子句内容每一项单独占一行，无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">8</span><span style="color: #808080">&gt;</span><span style="color: #000000">.Insert子句内容每个表字段单独占一行，无缩进；values每一项单独占一行，无缩进<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">9</span><span style="color: #808080">&gt;</span><span style="color: #000000">.SQL文中间不允许出现空行<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #808080">&gt;</span><span style="color: #000000">.C#里单引号必须跟所属的SQL子句处在同一行，连接符（"</span><span style="color: #808080">+</span><span style="color: #000000">"）必须在行首<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">).空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #808080">&gt;</span><span style="color: #000000">.SQL内算数运算符、逻辑运算符连接的两个元素之间必须用空格分隔<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #808080">&gt;</span><span style="color: #000000">.逗号之后必须接一个空格<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #808080">&gt;</span><span style="color: #000000">.关键字、保留字和左括号之间必须有一个空格</span></span></div>
<br />
<br />
<fieldset>　　 2.不等于统一使用"&lt;&gt;"。虽然 SQLServer认为"!="和"&lt;&gt;"是等价的，都代表不等于的意义。为了统一，不等于一律使用"&lt;&gt;"表示
<p>　　 3.使用表的别名, 数据库查询，必须使用表的别名。</p>
<p>　　 4.SQL文对表字段扩展的兼容性。在C#里使用Select *时，严禁通过getString(1)的形式得到查询结果，必须使用getString("字段名")的形式；使用Insert时，必须指定插入的字段名，严禁不指定字段名直接插入values　　 </p>
<p>　　 5.减少子查询的使用。子查询除了可读性差之外，还在一定程度上影响了SQL运行效率，请尽量减少使用子查询的使用，用其他效率更高、可读性更好的方式替代。　　 </p>
<p>　　 6.适当添加索引以提高查询效率，适当添加索引可以大幅度的提高检索速度，请参看SQLSERVER SQL性能优化系列。<br />
</p>
</fieldset><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_180053" onclick="this.style.display='none'; Code_Closed_Text_180053.style.display='none'; Code_Open_Image_180053.style.display='inline'; Code_Open_Text_180053.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_180053" style="display: none" onclick="this.style.display='none'; Code_Open_Text_180053.style.display='none'; Code_Closed_Image_180053.style.display='inline'; Code_Closed_Text_180053.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_180053" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">7.对数据库表操作的特殊要求　</span><span id="Code_Open_Text_180053" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="font-weight: bold; color: #800000">7</span><span style="color: #000000">.对数据库表操作的特殊要求　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;本项目对数据库表的操作还有以下特殊要求：　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">).以逻辑删除替代物理删除　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;注意：现在数据库表中数据没有物理删除，只有逻辑删除　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;以deleteflag字段作为删除标志，deleteflag</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">代表此记录被逻辑删除，因此在查询数据时必须考虑deleteflag的因素，deleteflag的标准查询条件：NVL(deleteflag,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">).增加记录状态字段　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;数据库中的每张表基本都有以下字段：DELETEFLAG、UPDATECOUNT、CREDATE、CREUSER、UPDATETIME、UPDATEUSER　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;要注意在对标进行操作时必须考虑以下字段　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;插入一条记录时要置DELETEFLAG</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">0</span><span style="color: #ff0000">'</span><span style="color: #000000">,&nbsp;UPDATECOUNT</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">,&nbsp;CREDATE</span><span style="color: #808080">=</span><span style="color: #000000">sysdate,&nbsp;CREUSER</span><span style="color: #808080">=</span><span style="color: #000000">登录User；查询一条记录时要考虑DELETEFLAG，如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查　；修改一条记录时要置UPDATETIME</span><span style="color: #808080">=</span><span style="color: #000000">sysdate,&nbsp;UPDATEUSER</span><span style="color: #808080">=</span><span style="color: #000000">登录User,&nbsp;UPDATECOUNT</span><span style="color: #808080">=</span><span style="color: #000000">(UPDATECOUNT</span><span style="color: #808080">+</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)&nbsp;mod&nbsp;</span><span style="font-weight: bold; color: #800000">1000</span><span style="color: #000000">,　；删除一条记录时要置DELETEFLAG</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1</span><span style="color: #ff0000">'</span><span style="color: #000000">　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;</span><span style="font-weight: bold; color: #800000">3</span><span style="color: #000000">).历史表　　&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　&nbsp;数据库里部分表还存在相应的历史表，比如srv_twc_f和srv_twchistory_f，在查询数据时除了检索所在表之外，还必须检索相应的历史表，对二者的结果做Union（或Union&nbsp;</span><span style="color: #808080">All</span><span style="color: #000000">）　　&nbsp;</span></span></div>
<br />
<br />
<fieldset><legend></legend>8.用执行计划分析SQL性能　　 <br />
　　 EXPLAIN PLAN是一个很好的分析SQL语句的工具，它可以在不执行SQL的情况下分析语句。通过分析，我们就可以知道SQLSERVER是怎样连接表，使用什么方式扫描表（索引扫描或全表扫描），以及使用到的索引名称，按照从里到外，从上到下的次序解读分析的结果，EXPLAIN PLAN的分析结果是用缩进的格式排列的，最内部的操作将最先被解读，如果两个操作处于同一层中，带有最小操作号的将首先被执行。目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具，PG需要将自己添加的查询SQL文记入log，然后在EXPLAIN PLAN中进行分析，尽量减少全表扫描，</fieldset><br />
<br />
 <img src ="http://www.blogjava.net/kiant/aggbug/226459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-09-02 18:03 <a href="http://www.blogjava.net/kiant/articles/226459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用PowerDesigner构建PDM的心得</title><link>http://www.blogjava.net/kiant/articles/213533.html</link><dc:creator>黄小二</dc:creator><author>黄小二</author><pubDate>Wed, 09 Jul 2008 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/kiant/articles/213533.html</guid><wfw:comment>http://www.blogjava.net/kiant/comments/213533.html</wfw:comment><comments>http://www.blogjava.net/kiant/articles/213533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kiant/comments/commentRss/213533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kiant/services/trackbacks/213533.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;工欲善其事，必先利其器。&#8221;通过构建PD的物理数据模型，我们可以方便直观的对数据库进行开发和维护。而且在学习过程中，也无疑的对数据库的设计有了更深一层的理解。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新建并选择好相应类型DBMS后我们就可以着手模型的环境配置了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、创建业务规则(<span lang="EN-US">Model-&gt;Business Rules</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果建立验证规则与列或域之间的联系，就可以过通过业务验证规则来检查参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps:&nbsp; 方式(Type)为验证（<span lang="EN-US">Validation</span><span style="font-family: 宋体;">）和约束（</span><span lang="EN-US">Constraint</span><span style="font-family: 宋体;">）类型的业务规则，绑定于PDM对象的Rules属性，能生成相应的数据库代码。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、设定默认值对象(<span lang="EN-US">Model-&gt;Defaults</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认值其实是数据库里面的一种对象，我们可以设定数据库的公共默认值来简化后续的操作。一般来说，默认是对象有数值型默认值、字符串型默认值和日期型默认值三种。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、设定域对象(<span lang="EN-US">Model-&gt;</span>Domain)，并绑定默认值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;域是PDM模型中的信息类型,在数据库里称为别名数据类型。使用域可以方便的使数据类型标准化。绑定了默认值对象的域，用于快速定义各表中列数据类型及默认值等属性。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、设定列对象为非空&nbsp;not null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用绑定默认值的域对象来设置列属性，防止代码读取字段时获得NULL对象，简化后期的工作。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里对Slash先生表达表达我的谢意，他制作的&#8220;PowerDesigner 中文教程&#8221;对我帮助很大，使我获益非浅。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <img src ="http://www.blogjava.net/kiant/aggbug/213533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kiant/" target="_blank">黄小二</a> 2008-07-09 10:10 <a href="http://www.blogjava.net/kiant/articles/213533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>