﻿<?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-blog.Toby-随笔分类-sql (sqlServer)</title><link>http://www.blogjava.net/SIDNEY/category/6408.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 06:09:06 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 06:09:06 GMT</pubDate><ttl>60</ttl><item><title>inner,outer,left,right join</title><link>http://www.blogjava.net/SIDNEY/archive/2008/05/27/203152.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 27 May 2008 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2008/05/27/203152.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/203152.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2008/05/27/203152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/203152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/203152.html</trackback:ping><description><![CDATA[<h4 class="TextColor1" style="margin-bottom: 0px">inner,outer,left,right join</h4>
<div class="bvMsg">SQL语句中的JION语句的认识- -
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<div>jion 语句有三种，inner join, left outer join 和 right outer join 都可以简写，分别为jion,left join,right jion。 </div>
<div>jion语句可以用来组合两个表中的记录，只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据，可以把它看成将两个具有相关内容的表联接在一起新生成的表，而一般的select 语句没有这个功能。</div>
<div><strong>1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>内连接，inner join ... on</strong></div>
<div>&nbsp;&nbsp;&nbsp; 语句格式:</div>
<p>&nbsp;&nbsp;&nbsp; FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 例子:</p>
<p>&nbsp;&nbsp;&nbsp; SELECT *</p>
<p>&nbsp;&nbsp;&nbsp; FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock</p>
<p>&nbsp;&nbsp;&nbsp; ORDER BY MemberDate DESC</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 内连接的功能是，把两个表相关联的记录列出来，必须是相关联的记录。</p>
<p>&nbsp;&nbsp;&nbsp;<strong>2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>左外连接，left outer join ... on</strong></p>
<p>&nbsp;&nbsp;&nbsp; 语句格式:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM [表名1] LEFT JOIN [表名2]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]</p>
<p>&nbsp;&nbsp;&nbsp; 其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留，而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN 和LEFT JOIN 相反。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 外连接的功能是，把LEFT左边的表中的所有记录保留，而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也保留，而右边表的字段为null.</p>
<p><strong>3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>右外连接，right outer join ... on</strong></p>
<p>&nbsp;&nbsp;&nbsp; 与 left join左右相反。</p>
<p><strong>4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>全连接，full join ... on(</strong><strong>不常使用，只能用于outer) </strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 功能结合了以上三种联军，先执行一次inner join,然后把两个表的多余字段都保留，但连接的对应字段为null.</p>
<p>如果想将几个表联接起来，在JOIN操作中我们可以进行嵌套操作，有三个表：表1、表2、表3，现在将三个表联接起来：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM （表1 INNER JOIN 表2 ON 表1.序号=表2.序号）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INNER JOIN 表3 ON 表1.序号=表3.序号</p>
<p>=====================</p>
<p>在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join <br />
当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用 <br />
Inner Join <br />
Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法 <br />
Select &lt;要选择的字段&gt; From &lt;主要资料表&gt; <br />
&lt;Join 方式&gt; &lt;次要资料表&gt; [On &lt;Join 规则&gt;] <br />
现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库 这篇文章 <br />
请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行 <br />
Select ProductId, ProductName, SupplierId From Products <br />
从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无虾米意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称 <br />
Select ProductId, ProductName, Suppliers.SupplierId <br />
From Products <br />
Inner Join Suppliers <br />
Products.Suppliers = Suppliers.SupplierId <br />
这款的查询结果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉 <br />
Outer Join <br />
这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法 <br />
Select &lt;要查询的字段&gt; From &lt;Left 资料表&gt; <br />
&lt;Left | Right&gt; [Outer] Join &lt;Right 资料表&gt; On &lt;Join 规则&gt; <br />
语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际操作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果 <br />
首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行 <br />
sp_helpconstraint Products <br />
接下来删除 FK_Products_Suppliers 这个 Foreign Key <br />
Alter Table Products <br />
Drop Constraint FK_Products_Suppliers <br />
再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录 <br />
Insert Into Products (ProductName,SupplierId,CategoryId) <br />
values ('Test Product','50','1') <br />
现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join <br />
Select ProductId, ProductName, Suppliers.SupplierId <br />
From Products <br />
Left Outer Join Suppliers <br />
Products.Suppliers = Suppliers.SupplierId <br />
比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别! <br />
再来看看 Right Outer Join, 请新增下底这笔记录 <br />
Insert Into Suppliers (CompanyName) <br />
values ('LearnASP') <br />
现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同! <br />
寻找不相符纪录 <br />
这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来 <br />
Select Suppliers.CompanyName From Products <br />
Right Join Suppliers <br />
On Products.SupplierId = Suppliers.SupplierId <br />
Where Products.SupplierId is Null <br />
执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行 <br />
Select Products.ProductName <br />
From Products <br />
Left Join Suppliers <br />
On Products.SupplierId = Suppliers.SupplierId <br />
Where Suppliers.SupplierId is Null <br />
这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料! <br />
<br />
<br />
</p>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/203152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2008-05-27 11:24 <a href="http://www.blogjava.net/SIDNEY/archive/2008/05/27/203152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>'SQLOLEDB' 无法启动分布式事务。 因为新事务不能登记到指定的事务处理器中。</title><link>http://www.blogjava.net/SIDNEY/archive/2008/03/31/189802.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 31 Mar 2008 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2008/03/31/189802.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/189802.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2008/03/31/189802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/189802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/189802.html</trackback:ping><description><![CDATA[-------------------------------------------------------------------------------------------------------------------------------------------------------<br />
操作未能执行，因为 OLE DB [/i][i]提供程序 'SQLOLEDB' [/i][i]无法启动分布式事务。 [OLE/DB provider returned message: [/i][i]新事务不能登记到指定的事务处理器中。 ] OLE DB [/i][i]错误跟踪［OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a[/i][i]］。<br />
--------------------------------------------------------------------------------------------------------------------------------------------------------<br />
管理工具--&gt;组件服务--&gt;组件服务--&gt;计算机--&gt;右键 我的电脑 --&gt;属性--&gt;MSDTC --&gt;安全配置--&gt;里面都打勾(不要求验证)
<img src ="http://www.blogjava.net/SIDNEY/aggbug/189802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2008-03-31 16:29 <a href="http://www.blogjava.net/SIDNEY/archive/2008/03/31/189802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 索引结构及其使用</title><link>http://www.blogjava.net/SIDNEY/archive/2008/03/28/189215.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Fri, 28 Mar 2008 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2008/03/28/189215.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/189215.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2008/03/28/189215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/189215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/189215.html</trackback:ping><description><![CDATA[<p><strong><strong>SQL Server 索引结构及其使用（一）<br />
</strong><br />
作者：<a href="http://www.vckbase.com/bbs/userinfo.asp?id=freedk" target="_blank">freedk</a><br />
<br />
一、深入浅出理解索引结构</strong><br />
<br />
　　实际上，您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引：聚集索引（clustered index，也称聚类索引、簇集索引）和非聚集索引（nonclustered index，也称非聚类索引、非簇集索引）。下面，我们举例来说明一下聚集索引和非聚集索引的区别：<br />
　　其实，我们的汉语字典的正文本身就是一个聚集索引。比如，我们要查&#8220;安&#8221;字，就会很自然地翻开字典的前几页，因为&#8220;安&#8221;的拼音是&#8220;an&#8221;，而按照拼音排序汉字的字典是以英文字母&#8220;a&#8221;开头并以&#8220;z&#8221;结尾的，那么&#8220;安&#8221;字就自然地排在字典的前部。如果您翻完了所有以&#8220;a&#8221;开头的部分仍然找不到这个字，那么就说明您的字典中没有这个字；同样的，如果查&#8220;张&#8221;字，那您也会将您的字典翻到最后部分，因为&#8220;张&#8221;的拼音是&#8220;zhang&#8221;。也就是说，字典的正文部分本身就是一个目录，您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为&#8220;聚集索引&#8221;。<br />
　　如果您认识某个字，您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字，不知道它的发音，这时候，您就不能按照刚才的方法找到您要查的字，而需要去根据&#8220;偏旁部首&#8221;查到您要找的字，然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合&#8220;部首目录&#8221;和&#8220;检字表&#8221;而查到的字的排序并不是真正的正文的排序方法，比如您查&#8220;张&#8221;字，我们可以看到在查部首之后的检字表中&#8220;张&#8221;的页码是672页，检字表中&#8220;张&#8221;的上面是&#8220;驰&#8221;字，但页码却是63页，&#8220;张&#8221;的下面是&#8220;弩&#8221;字，页面是390页。很显然，这些字并不是真正的分别位于&#8220;张&#8221;字的上下方，现在您看到的连续的&#8220;驰、张、弩&#8221;三字实际上就是他们在非聚集索引中的排序，是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字，但它需要两个过程，先找到目录中的结果，然后再翻到您所需要的页码。我们把这种目录纯粹是目录，正文纯粹是正文的排序方式称为&#8220;非聚集索引&#8221;。<br />
　　通过以上例子，我们可以理解到什么是&#8220;聚集索引&#8221;和&#8220;非聚集索引&#8221;。进一步引申一下，我们可以很容易的理解：每个表只能有一个聚集索引，因为目录只能按照一种方法进行排序。<br />
<br />
<strong>二、何时使用聚集索引或非聚集索引</strong><br />
<br />
下面的表总结了何时使用聚集索引或非聚集索引（很重要）：</p>
<table id="AutoNumber1" style="color: #000000; border-collapse: collapse" height="107" cellspacing="0" cellpadding="0" width="62%" border="1">
    <tbody>
        <tr>
            <td align="center" width="40%" height="23">动作描述</td>
            <td align="center" width="29%" height="23">使用聚集索引</td>
            <td align="center" width="31%" height="23">使用非聚集索引</td>
        </tr>
        <tr>
            <td width="40%" height="20">列经常被分组排序</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">返回某范围内的数据</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">一个或极少不同值</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">小数目的不同值</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">大数目的不同值</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">频繁更新的列</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">外键列</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">主键列</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">频繁修改索引列</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
    </tbody>
</table>
<p>　　事实上，我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如：返回某范围内的数据一项。比如您的某个表有一个时间列，恰好您把聚合索引建立在了该列，这时您查询2004年1月1日至2004年10月1日之间的全部数据时，这个速度就将是很快的，因为您的这本字典正文是按日期进行排序的，聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可；而不像非聚集索引，必须先查到目录中查到每一项数据对应的页码，然后再根据页码查到具体内容。<br />
<br />
<strong>三、结合实际，谈索引使用的误区</strong><br />
<br />
　　理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引，但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区，以便于大家掌握索引建立的方法。<br />
<br />
1、主键就是聚集索引<br />
　　这种想法笔者认为是极端错误的，是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。<br />
　　通常，我们会在每个表中都建立一个ID列，以区分每条数据，并且这个ID列是自动增大的，步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。此时，如果我们将这个列设为主键，SQL SERVER会将此列默认为聚集索引。这样做有好处，就是可以让您的数据在数据库中按照ID进行物理排序，但笔者认为这样做意义不大。<br />
　　显而易见，聚集索引的优势是很明显的，而每个表中只能有一个聚集索引的规则，这使得聚集索引变得更加珍贵。<br />
　　从我们前面谈到的聚集索引的定义我们可以看出，使用聚集索引的最大好处就是能够根据查询要求，迅速缩小查询范围，避免全表扫描。在实际应用中，因为ID号是自动生成的，我们并不知道每条记录的ID号，所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次，让每个ID号都不同的字段作为聚集索引也不符合&#8220;大数目的不同值情况下不应建立聚合索引&#8221;规则；当然，这种情况只是针对用户经常修改记录内容，特别是索引项的时候会负作用，但对于查询速度并没有影响。<br />
　　在办公自动化系统中，无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。<br />
　　通常，办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况，但如果您的系统已建立了很长时间，并且数据量很大，那么，每次每个用户打开首页的时候都进行一次全表扫描，这样做意义是不大的，绝大多数的用户1个月前的文件都已经浏览过了，这样做只能徒增数据库的开销而已。事实上，我们完全可以让用户打开系统首页时，数据库仅仅查询这个用户近3个月来未阅览的文件，通过&#8220;日期&#8221;这个字段来限制表扫描，提高查询速度。如果您的办公自动化系统已经建立的2年，那么您的首页显示速度理论上将是原来速度8倍，甚至更快。<br />
　　在这里之所以提到&#8220;理论上&#8221;三字，是因为如果您的聚集索引还是盲目地建在ID这个主键上时，您的查询速度是没有这么高的，即使您在&#8220;日期&#8221;这个字段上建立的索引（非聚合索引）。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现（3个月内的数据为25万条）：<br />
<br />
（1）仅在主键上建立聚集索引，并且不划分时间段：</p>
<pre>Select gid,fariqi,neibuyonghu,title from tgongwen</pre>
<p>用时：128470毫秒（即：128秒）<br />
<br />
（2）在主键上建立聚集索引，在fariq上建立非聚集索引：</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：53763毫秒（54秒）<br />
<br />
（3）将聚合索引建立在日期列（fariqi）上：</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：2423毫秒（2秒）<br />
<br />
　　虽然每条语句提取出来的都是25万条数据，各种情况的差异却是巨大的，特别是将聚集索引建立在日期列时的差异。事实上，如果您的数据库真的有1000万容量的话，把主键建立在ID列上，就像以上的第1、2种情况，在网页上的表现就是超时，根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。得出以上速度的方法是：在各个select语句前加：</p>
<pre>declare @d datetime
set @d=getdate()</pre>
<p>并在select语句后加：</p>
<pre>select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())</pre>
<p>2、只要建立索引就能显著提高查询速度<br />
　　事实上，我们可以发现上面的例子中，第2、3条语句完全相同，且建立索引的字段也相同；不同的仅是前者在fariqi字段上建立的是非聚合索引，后者在此字段上建立的是聚合索引，但查询速度却有着天壤之别。所以，并非是在任何字段上简单地建立索引就能提高查询速度。<br />
　　从建表的语句中，我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中，我们每天都会发几个文件，这几个文件的发文日期就相同，这完全符合建立聚集索引要求的：&#8220;既不能绝大多数都相同，又不能只有极少数相同&#8221;的规则。由此看来，我们建立&#8220;适当&#8221;的聚合索引对于我们提高查询速度是非常重要的。<br />
<br />
3、把所有需要提高查询速度的字段都加进聚集索引，以提高查询速度<br />
　　上面已经谈到：在进行数据查询时都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。既然这两个字段都是如此的重要，我们可以把他们合并起来，建立一个复合索引（compound index）。<br />
　　很多人认为只要把任何字段加进聚集索引，就能提高查询速度，也有人感到迷惑：如果把复合的聚集索引字段分开查询，那么查询速度会减慢吗？带着这个问题，我们来看一下以下的查询速度（结果集都是25万条数据）：（日期列fariqi首先排在复合聚集索引的起始列，用户名neibuyonghu排在后列）：</p>
<pre>（1）select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi&gt;''2004-5-5'' </pre>
<p>查询速度：2513毫秒</p>
<pre>（2）select gid,fariqi,neibuyonghu,title from Tgongwen
　　　　　　　　　　　　where fariqi&gt;''2004-5-5'' and neibuyonghu=''办公室''</pre>
<p>查询速度：2516毫秒</p>
<pre>（3）select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''</pre>
<p>查询速度：60280毫秒<br />
<br />
　　从以上试验中，我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的，甚至比用上全部的复合索引列还要略快（在查询结果集数目一样的情况下）；而如果仅用复合聚集索引的非起始列作为查询条件的话，这个索引是不起任何作用的。当然，语句1、2的查询速度一样是因为查询的条目数一样，如果复合索引的所有列都用上，而且查询结果少的话，这样就会形成&#8220;索引覆盖&#8221;，因而性能可以达到最优。同时，请记住：无论您是否经常使用聚合索引的其他列，但其前导列一定要是使用最频繁的列。<br />
<br />
<strong>四、其他书上没有的索引使用经验总结</strong><br />
<br />
1、用聚合索引比用不是聚合索引的主键速度快<br />
　　下面是实例语句：（都是提取25万条数据）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>使用时间：3326毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid&lt;=250000</pre>
<p>使用时间：4470毫秒<br />
<br />
这里，用聚合索引比用不是聚合索引的主键速度快了近1/4。<br />
<br />
2、用聚合索引比用一般的主键作order by时速度快，特别是在小数据量情况下</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi</pre>
<p>用时：12936</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid</pre>
<p>用时：18843<br />
<br />
　　这里，用聚合索引比用一般的主键作order by时，速度快了3/10。事实上，如果数据量很小的话，用聚集索引作为排序列要比使用非聚集索引速度快得明显的多；而数据量如果很大的话，如10万以上，则二者的速度差别不明显。<br />
<br />
3、使用聚合索引内的时间段，搜索时间会按数据占整个数据表的百分比成比例减少，而无论聚合索引使用了多少个：</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-1-1''</pre>
<p>用时：6343毫秒（提取100万条） </p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-6-6''</pre>
<p>用时：3170毫秒（提取50万条）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>用时：3326毫秒（和上句的结果一模一样。如果采集的数量一样，那么用大于号和等于号是一样的）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen
　　　　　　　　　　　　where fariqi&gt;''2004-1-1'' and fariqi&lt;''2004-6-6''</pre>
<p>用时：3280毫秒<br />
<br />
4、日期列不会因为有分秒的输入而减慢查询速度<br />
　　下面的例子中，共有100万条数据，2004年1月1日以后的数据有50万条，但只有两个不同的日期，日期精确到日；之前有数据50万条，有5000个不同的日期，日期精确到秒。</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen
　　　　　　　　　　where fariqi&gt;''2004-1-1'' order by fariqi</pre>
<p>用时：6390毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen
　　　　　　　　　　　　where fariqi&lt;''2004-1-1'' order by fariqi</pre>
<p>用时：6453毫秒<br />
<br />
<strong>五、其他注意事项</strong><br />
<br />
　　&#8220;水可载舟，亦可覆舟&#8221;，索引也一样。索引有助于提高检索性能，但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引，数据库就要做更多的工作。过多的索引甚至会导致索引碎片。<br />
　　所以说，我们要建立一个&#8220;适当&#8221;的索引体系，特别是对聚合索引的创建，更应精益求精，以使您的数据库能得到高性能的发挥。<br />
　　当然，在实践中，作为一个尽职的数据库管理员，您还要多测试一些方案，找出哪种方案效率最高、最为有效。<br />
<br />
（待续...）<br />
<br />
trackback: <a href="http://www.vckbase.com/document/viewdoc/?id=1307">http://www.vckbase.com/document/viewdoc/?id=1307</a><br />
<br />
</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/189215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2008-03-28 10:56 <a href="http://www.blogjava.net/SIDNEY/archive/2008/03/28/189215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批量检查所有数据表</title><link>http://www.blogjava.net/SIDNEY/archive/2008/01/31/178631.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Thu, 31 Jan 2008 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2008/01/31/178631.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/178631.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2008/01/31/178631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/178631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/178631.html</trackback:ping><description><![CDATA[<div>
<p style="margin: 0cm 0cm 0pt"><font face="宋体" color="black" size="2">&nbsp;</font><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">DECLARE</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> dt_Cursor <font color="blue"><span style="color: blue">CURSOR</span></font> DYNAMIC <font color="blue"><span style="color: blue">FOR</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">select</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> obj<font color="gray"><span style="color: gray">.</span></font>name<font color="green"><span style="color: green">--, count(*)</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">from</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> <font color="green"><span style="color: green">sysobjects</span></font> obj<font color="gray"><span style="color: gray">,</span></font> <font color="green"><span style="color: green">syscolumns</span></font> col </span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">where</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> obj<font color="gray"><span style="color: gray">.</span></font>id<font color="gray"><span style="color: gray">=</span></font>col<font color="gray"><span style="color: gray">.</span></font>id <font color="gray"><span style="color: gray">and</span></font> col<font color="gray"><span style="color: gray">.</span></font>name <font color="gray"><span style="color: gray">=</span></font> <font color="red"><span style="color: red">'SEC_CD'</span></font> <font color="gray"><span style="color: gray">and</span></font> obj<font color="gray"><span style="color: gray">.</span></font>type<font color="gray"><span style="color: gray">=</span></font><font color="red"><span style="color: red">'U'</span></font> </span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">OPEN</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> dt_Cursor</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">declare</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> @firstLine <font color="blue"><span style="color: blue">bit</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">set</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> @firstLine <font color="gray"><span style="color: gray">=</span></font> 1</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">Declare</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> @sql varchar<font color="gray"><span style="color: gray">(</span></font>8000<font color="gray"><span style="color: gray">)</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">set</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> @sql <font color="gray"><span style="color: gray">=</span></font> <font color="red"><span style="color: red">''</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">Declare</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> @tblName varchar<font color="gray"><span style="color: gray">(</span></font>100<font color="gray"><span style="color: gray">)</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">FETCH</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> NEXT <font color="blue"><span style="color: blue">FROM</span></font> dt_Cursor <font color="blue"><span style="color: blue">INTO</span></font> @tblName</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">WHILE</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> <font color="fuchsia"><span style="color: fuchsia">@@FETCH_STATUS</span></font> <font color="gray"><span style="color: gray">=</span></font> 0</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">BEGIN</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; <font color="blue"><span style="color: blue">if</span></font> @firstLine<font color="gray"><span style="color: gray">=</span></font>1</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="blue"><span style="color: blue">set</span></font> @firstLine<font color="gray"><span style="color: gray">=</span></font>0</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; <font color="blue"><span style="color: blue">else</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="blue"><span style="color: blue">set</span></font> @sql <font color="gray"><span style="color: gray">=</span></font> @sql <font color="gray"><span style="color: gray">+</span></font> <font color="red"><span style="color: red">' union all '</span></font> </span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; <font color="blue"><span style="color: blue">set</span></font> @sql <font color="gray"><span style="color: gray">=</span></font> @sql <font color="gray"><span style="color: gray">+</span></font> <font color="red"><span style="color: red">'select '''</span></font> <font color="gray"><span style="color: gray">+</span></font> @tblName <font color="gray"><span style="color: gray">+</span></font> <font color="red"><span style="color: red">''' as TABLE_NM, count(*) as ROW_CNT from '</span></font> <font color="gray"><span style="color: gray">+</span></font> @tblName <font color="gray"><span style="color: gray">+</span></font> <font color="red"><span style="color: red">' where SEC_CD=''02188'''</span></font></span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="red" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; <font color="blue"><span style="color: blue">FETCH</span></font> NEXT <font color="blue"><span style="color: blue">FROM</span></font> dt_Cursor <font color="blue"><span style="color: blue">INTO</span></font> @tblName</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">END</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">CLOSE</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> dt_Cursor</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">DEALLOCATE</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> dt_Cursor</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" size="2">&nbsp;</font></p>
<p style="margin: 0cm 0cm 0pt"><font face="Courier New" color="blue" size="2"><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">exec</span></font><font face="Courier New" size="2"><span style="font-size: 10pt; font-family: 'Courier New'"> <font color="gray"><span style="color: gray">(</span></font>@sql<font color="gray"><span style="color: gray">)</span></font></span></font></p>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/178631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2008-01-31 10:55 <a href="http://www.blogjava.net/SIDNEY/archive/2008/01/31/178631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL server 2000邮件配置方法</title><link>http://www.blogjava.net/SIDNEY/archive/2008/01/18/176102.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Fri, 18 Jan 2008 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2008/01/18/176102.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/176102.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2008/01/18/176102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/176102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/176102.html</trackback:ping><description><![CDATA[SQL server 2000邮件配置方法<br />
<br />
<font color="#008000">--========================================<br />
--SQL 邮件配置<br />
--outlook 2003，sql server 2000，163邮局<br />
--========================================<br />
</font><strong>OutLook配置</strong>:OutLook 2000 网上说经常发不成功,我用的是<span style="color: red">OutLook 2003</span>,打开sql server 2000的企业管理器，展开支持服务，右击&#8220;sql 邮件&#8221;点属性。这时里面就会出现有outlook了。选择它就可以了。<br />
<strong>sql server 2000</strong>:在控制面板中打开&#8220;服务&#8221;，找到：MSSQLSERVER 和 SQLSERVERAGENT，其登录方式不应该为&#8220;本地系统&#8221;，应该是具有邮件客户端程序操作权限的 Windows 用户，比如 Windows 管理员，修改方法为，双击该服务，切换到&#8220;登录&#8221;标签，选择&#8220;此帐户&#8221;，点击&#8220;浏览&#8221;选择一个用户，并输入密码，点击&#8220;确定&#8221;。右键，重新启动这两个服务。展开&#8220;管理&#8221;，&#8220;SQL Server 代理&#8221;，在&#8220;操作员&#8221;上点击右键，&#8220;新建一个操作员&#8221;，这个操作员就是我们要向其发送电子邮件的人。在&#8220;企业管理器&#8221;中，展开&#8220;支持服务&#8221;，在&#8220;SQL 邮件&#8221;上点击右键，&#8220;属性&#8221;，在下拉列表框中选择&#8220;配置文件名&#8221;，点击测试,检查是否成功.如果我们要对作业进行监视，比如当数据库备份失败时向操作员发送邮件，就得在&#8220;SQL Server 代理&#8221;的&#8220;作业&#8221;列表中打开对应作业的属性，切换到&#8220;通知&#8221;标签，选择相应操作员即可。至此，一个 SQL 邮件配置就完成了，请确保您的 SQL Server Agent 随时都在运行。请确保您的 SQL Server 补丁是最新的。<br />
<br />
要注意的几个问题：<br />
1.sql server 2000的启动帐户要和sqlagent的启动帐户相同。并且不能用系统帐户。<br />
2.smtp服务器是否需要验证。hotmail的免费信箱好像不可以在outlook里设置,最好用OutLook 2003 <br />
3.在sql邮件运行过程中不能关闭outlook，否则不能发送邮件,要先启动OutLook 2003 再启动 SQL ,可执行exec startmail /exec stopmail 来启动或停止sqlmail.<br />
<br />
--下面为测试代码，可将直接放入作业里，增加调度即可运行.<br />
<font color="#008000">--=======================================<br />
--将存储过程的结果发送给指定联系人<br />
--=======================================</font><br />
exec xp_sendmail [url=mailto:'<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">***@hotmail.com</a></font></a>',@query='sp_configure']<font color="#274306">'<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">***@hotmail.com</a></font></a>',@query='sp_configure'</font>[/url]<br />
<font color="#008000">--============================================<br />
--统计northwind数据库中相关信息<br />
--并将结果发送到指定的信箱<br />
--原理：northwind数据库中没有xp-sendmail<br />
--存储过程，所以采用方式为：<br />
--将查询结果写入一个全局临时表<br />
--然后在删除全局临时表<br />
--===========================================</font><br />
set nocount on<br />
select case when(grouping(od.productid)=1)then '定单总计:'<br />
else isnull(od.productid,'空值') end as productid,<br />
case when (grouping(od.orderid)=1)then '产品总计:'<br />
else isnull(od.orderid,'空值')end as orderid,sum(od.quantity) as'总计'<br />
into ##boyi55<br />
from (select convert(nvarchar(10),productid) as productid,convert(nvarchar(10),orderid) as orderid,quantity from [order details]) as od<br />
group by od.productid,od.orderid<br />
with cube<br />
exec master..xp_sendmail @recipients='<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#49;&#49;&#104;&#57;&#57;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#49;&#49;&#104;&#57;&#57;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">h11h99@126.com</a></font></a>;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">fengjicai@hotmail.com</a></font></a>;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#113;&#117;&#101;&#101;&#110;&#121;&#95;&#102;&#101;&#105;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#113;&#117;&#101;&#101;&#110;&#121;&#95;&#102;&#101;&#105;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">queeny_fei@yahoo.com.cn</a></font></a>',<br />
@subject='northwind数据库中order details相关信息汇总结果',<br />
@message='此信息由sql server 2000数据库作业自动发送，如果输出错误，请直接回复e-mail到：[url=mailto:fengjicai@hotmail.com]<font color="#274306"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">***@hotmail.com</a></font>[/url]',<br />
@query='select * from ##boyi55',<br />
@width=100--设置查询的输出文本行宽<br />
drop table ##boyi55<br />
set nocount off<br />
<br />
<font color="#008000">--===========================================<br />
--将结果作为附件文件发送<br />
--===========================================</font><br />
exec master..xp_sendmail @recipients='<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color="#000000"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#102;&#101;&#110;&#103;&#106;&#105;&#99;&#97;&#105;&#64;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">***@hotmail.com</a></font></a>',<br />
@query='select * from information_schema.tables',<br />
@subject='SQL Server report',<br />
@message='The contents of information_schema.tables:',<br />
@attach_results='true',<br />
@width= 250<br />
<font color="#008000">======================<span style="color: red"><br />
</span></font>
<p>&nbsp;<br />
<br />
<font color="#008000">--===========================================<br />
--===========================================</font><br />
xp_sendmail {[@recipients =] "recipients [;...n]"} <br />
　　[,[@message =] "message"] <br />
　　[,[@query =] "query"] <br />
　　[,[@attachments =] attachments] <br />
　　[,[@copy_recipients =] "copy_recipients [;...n]" <br />
　　[,[@blind_copy_recipients =] "blind_copy_recipients [;...n]" <br />
　　[,[@subject =] "subject"] <br />
　　[,[@type =] "type"] <br />
　　[,[@attach_results =] "attach_value"] <br />
　　[,[@no_output =] "output_value"] <br />
　　[,[@no_header =] "header_value"] <br />
　　[,[@width =] width] <br />
　　[,[@separator =] "separator"] <br />
　　[,[@echo_error =] "echo_value"] <br />
　　[,[@set_user =] "user"] <br />
　　[,[@dbuse =] "database"] <br />
　　 <br />
　　其中@recipients是必需的 <br />
　　 <br />
　　参数说明： <br />
　　 <br />
　　参数 说明 <br />
　　@recipients 收件人，中间用逗号分开 <br />
　　@message 要发送的信息 <br />
　　@query 确定执行并依附邮件的有效查询，除触发器中的插入表及删除表外，此查询能引用任何对象 <br />
　　@attachments 附件 <br />
　　@copy_recipients 抄送 <br />
　　@blind_copy_recipients 密送 <br />
　　@subject 标题 <br />
　　@attach_results 指定查询结果做为附件发送 <br />
　　@no_header 不发送查询结果的列名 <br />
　　@set_user 查询联接的用户名，默认为Guset <br />
　　@dbuse 查询所用的数据库，默认为缺省数据库</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/176102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2008-01-18 10:17 <a href="http://www.blogjava.net/SIDNEY/archive/2008/01/18/176102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>备份数据库</title><link>http://www.blogjava.net/SIDNEY/archive/2007/12/21/169234.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Fri, 21 Dec 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/12/21/169234.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/169234.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/12/21/169234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/169234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/169234.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>USE [msdb]</p>
<p>GO</p>
<p>/****** 对象:&nbsp; Job [pdw远程备份到192.168.36.38(每周7覆盖更新)]&nbsp;&nbsp;&nbsp; 脚本日期: 12/21/2007 09:37:05 ******/</p>
<p>BEGIN TRANSACTION</p>
<p>DECLARE @ReturnCode INT</p>
<p>SELECT @ReturnCode = 0</p>
<p>/****** 对象:&nbsp; JobCategory [Database Maintenance]&nbsp;&nbsp;&nbsp; 脚本日期: 12/21/2007 09:37:05 ******/</p>
<p>IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1)</p>
<p>BEGIN</p>
<p>EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance'</p>
<p>IF (@@ERROR &lt;&gt; 0 OR @ReturnCode &lt;&gt; 0) GOTO QuitWithRollback</p>
<p>&nbsp;</p>
<p>END</p>
<p>&nbsp;</p>
<p>DECLARE @jobId BINARY(16)</p>
<p>EXEC @ReturnCode =&nbsp; msdb.dbo.sp_add_job @job_name=N'pdw远程备份到192.168.36.38(每周7覆盖更新)', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @enabled=1, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @notify_level_eventlog=2, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @notify_level_email=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @notify_level_netsend=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @notify_level_page=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @delete_level=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @description=N'pdw远程备份到192.168.36.38(每周7覆盖更新)', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @category_name=N'Database Maintenance', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @owner_login_name=N'sa', @job_id = @jobId OUTPUT</p>
<p>IF (@@ERROR &lt;&gt; 0 OR @ReturnCode &lt;&gt; 0) GOTO QuitWithRollback</p>
<p>/****** 对象:&nbsp; Step [a net use&nbsp; \\192.168.36.38]&nbsp;&nbsp;&nbsp; 脚本日期: 12/21/2007 09:37:06 ******/</p>
<p>EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'a net use&nbsp; \\192.168.36.38', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @step_id=1, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @cmdexec_success_code=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_success_action=3, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_success_step_id=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_fail_action=2, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_fail_step_id=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_attempts=10, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_interval=1, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @os_run_priority=0, @subsystem=N'TSQL', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @command=N'--pdw远程备份设备安装到192.168.36.38</p>
<p>master..xp_cmdshell ''net use&nbsp; \\192.168.36.38 ****** /user:editor''', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @database_name=N'master', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @flags=0</p>
<p>IF (@@ERROR &lt;&gt; 0 OR @ReturnCode &lt;&gt; 0) GOTO QuitWithRollback</p>
<p>/****** 对象:&nbsp; Step [BACKUP DATABASE [CSRC_RS_NEW]]]&nbsp;&nbsp;&nbsp; 脚本日期: 12/21/2007 09:37:06 ******/</p>
<p>EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'BACKUP DATABASE [CSRC_RS_NEW]', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @step_id=2, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @cmdexec_success_code=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_success_action=3, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_success_step_id=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_fail_action=2, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @on_fail_step_id=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_attempts=0, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @retry_interval=1, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @os_run_priority=0, @subsystem=N'TSQL', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @command=N'BACKUP DATABASE [CSRC_RS_NEW] TO&nbsp; DISK = N''\\192.168.36.38\d$\data_bak\CSRC_RS_NEW.bak'' WITH&nbsp; INIT ,&nbsp; NOUNLOAD ,&nbsp; NAME = N''CSRC_RS_NEW'',&nbsp; NOSKIP ,&nbsp; STATS = 10,&nbsp; NOFORMAT', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @database_name=N'CSRC_RS_NEW', </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @flags=0</p>
<p>IF (@@ERROR &lt;&gt; 0 OR @ReturnCode &lt;&gt; 0) GOTO QuitWithRollback</p>
<p>EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'</p>
<p>COMMIT TRANSACTION</p>
<p>GOTO EndSave</p>
<p>QuitWithRollback:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF (@@TRANCOUNT &gt; 0) ROLLBACK TRANSACTION</p>
<p>EndSave:</p>
<p>&nbsp;<br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/169234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-12-21 09:54 <a href="http://www.blogjava.net/SIDNEY/archive/2007/12/21/169234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>参考：SQL排名算法</title><link>http://www.blogjava.net/SIDNEY/archive/2007/11/19/161643.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 19 Nov 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/11/19/161643.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/161643.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/11/19/161643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/161643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/161643.html</trackback:ping><description><![CDATA[列出每一行的排名是一個常見的需求，可惜 SQL 並沒有一個很直接的方式達到這個需求。要以 SQL 列出排名，基本的概念是要做一個表格自我連結 (self join)，將結果依序列出，然後算出每一行之前 (包含那一行本身) 有多少行數。這樣講讀者聽得可能有點困惑，所以最好的方式是用一個實例來介紹。假設我們有以下的表格：
<p><strong><em><font face="宋体" size="3"><span style="font-weight: bold; font-size: 12pt; font-style: italic">Total_Sales</span></font></em></strong>表格</p>
<table cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Name</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Sales</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">John</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">10</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Jennifer</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">15</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Stella</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">20</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Sophia</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">40</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Greg</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">50</span></font></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">Jeff</span></font></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><font face="Verdana" size="1"><span style="font-size: 9pt; font-family: Verdana">20</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p><font face="宋体" size="3">&nbsp;</font></p>
<p><font face="宋体" size="3"><span style="font-size: 12pt">要找出每一行的排名，我們就打入以下的 SQL 語句：</span></font></p>
<p><strong><font face="宋体" color="blue" size="3"><span style="font-weight: bold; font-size: 12pt; color: blue">SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank <br />
FROM Total_Sales a1, Total_Sales a2 <br />
WHERE a1.Sales &lt;= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) <br />
GROUP BY a1.Name, a1.Sales <br />
ORDER BY a1.Sales DESC, a1.Name DESC;</span></font></strong></p>
<p><em><font face="宋体" size="3"><span style="font-size: 12pt; font-style: italic">結果:</span></font></em></p>
<table cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><u><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Name</span></font></u></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><u><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Sales</span></font></u></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><u><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Sales_Rank</span></font></u></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Greg</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">50</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">1</span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Sophia</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">40</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">2</span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Stella</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">20</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">3</span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Jeff</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">20</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">3</span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">Jennifer</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">15</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">5</span></font></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">John</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">10</span></font></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="margin: 0cm 0cm 0pt"><strong><font face="Verdana" color="royalblue" size="2"><span style="font-weight: bold; font-size: 10pt; color: royalblue; font-family: Verdana">6</span></font></strong></p>
            </td>
        </tr>
    </tbody>
</table>
<p><font face="宋体" size="3"><span style="font-size: 12pt">我們先來看 <strong><font color="green"><span style="font-weight: bold; color: green">WHERE</span></font></strong>子句。在字句的第一部分 (a1.Sales &lt;= a2.Sales)，我們算出有多少筆資料 Sales 欄位的值是比自己本身的值小或是相等。如果在 Sales 欄位中沒有同樣大小的資料，那這部分的 <strong><font color="green"><span style="font-weight: bold; color: green">WHERE</span></font></strong>子句本身就可以產生出正確的排名。 </span></font></p>
<p><font face="宋体" size="3"><span style="font-size: 12pt">子句的第二部分，(a1.Sales=a2.Sales and a1.Name = a2.Name)，則是讓我們在 Sales 欄位中有同樣大小的資料時 (像 Stella 及 Jeff 這兩筆資料)，仍然能夠產生正確的排名。 </span></font></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/161643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-11-19 16:02 <a href="http://www.blogjava.net/SIDNEY/archive/2007/11/19/161643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求某一字符在一字符串中出现的次数(SQL)</title><link>http://www.blogjava.net/SIDNEY/archive/2007/10/30/156984.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 30 Oct 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/10/30/156984.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/156984.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/10/30/156984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/156984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/156984.html</trackback:ping><description><![CDATA[--想知道其中","出现的次数，可以用下面的方法实现，而不需要复杂的一个个字符分析。<br />
declare @a varchar(100)<br />
set @a='22,11,2601,2603'<br />
select len(replace(@a,',',',,'))-len(@a)
<img src ="http://www.blogjava.net/SIDNEY/aggbug/156984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-10-30 17:02 <a href="http://www.blogjava.net/SIDNEY/archive/2007/10/30/156984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL2005-SSIS 对同一个文件中的不同行类型做不同处理</title><link>http://www.blogjava.net/SIDNEY/archive/2007/10/07/150852.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Sun, 07 Oct 2007 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/10/07/150852.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/150852.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/10/07/150852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/150852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/150852.html</trackback:ping><description><![CDATA[<p>某些时候数据来源是文本文件，有时候我们经常看到包含主/细、父/子记录在同一个文本文件中，这在DTS中是非常难以处理的，但这种情况在SSIS中有所改变<br />
在本文中，我将制造这样一个例子让你明白如何处理这种类型的要求</p>
<p>大体的数据流构造像下面这样，我会仔细加以讲解：<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/PackageLayout.jpg" /> </p>
<p>下面这个图显示了我们要处理的数据来源的文本格式，其中含有&#8220;M&#8221;的为主行，含有&#8220;D&#8221;的为子行<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/HowTheTextFileLooks.jpg" /></p>
<p>我们将建立一个flat file connection manager指向该文件，在这里，我并不打算把行拆分出来，暂时把整行读在一列中<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/FlatFileConnectionManager.jpg" /></p>
<p>下一步我们将拖曳一个 Flat File Source Adapter 组件到数据流面板，并指定来源和上面所建立的连接来源，且指定输出列<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/RenamedOutputColumn.jpg" />&nbsp;</p>
<p>完成这个操作后，我们将用 Conditional Split Transform 组件来把文件中的记录流向不同的输出，配置如下<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/TheConditionalSplit.jpg" /></p>
<p>现在我们已经完成了主从行的不同流向，下一步我们将用 Script Transform 把行中的信息拆开到不同的列中去<br />
使用Script Transform组件的第一步是添加一些输出列,当数据经过这个组件时，下游的组件将可以看到这些列<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/MasterScriptOutputColumns.jpg" /></p>
<p>到现在，我们只定义了Script Transform 组件将产生这些列，但并没有具体的指定列中的内容，下面我们可以通过设计以下脚本来实现不同列的内容是什么<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/CodeToParseTheWholeMasterLine.jpg" /></p>
<p>最后，我们只需放上2个Raw File Destination Adapter组件接收输出即可，下面是包的运行结果<br />
&nbsp;<img alt="" src="http://www.sqlis.com/images/Master%20Detail%20Files/PackageRunSuccessfully.jpg" /><br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<p>&nbsp;</p>
文章来源：http://www.sqlis.com/default.aspx?54<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=449886</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/150852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-10-07 16:16 <a href="http://www.blogjava.net/SIDNEY/archive/2007/10/07/150852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化SQL Server索引的小技巧 </title><link>http://www.blogjava.net/SIDNEY/archive/2007/09/10/144033.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 10 Sep 2007 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/09/10/144033.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/144033.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/09/10/144033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/144033.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/144033.html</trackback:ping><description><![CDATA[<p align="left">&nbsp;</p>
<p align="left"><img height="32" src="http://www.builder.com.cn/i/developer/other/builder.jpg" width="168" align="left"  alt="" />SQL Server中有几个可以让你检测、调整和优化SQL Server性能的工具。在本文中，我将说明如何用SQL Server的工具来优化数据库索引的使用，本文还涉及到有关索引的一般性知识。</p>
<h5>关于索引的常识</h5>
<p>影响到数据库性能的最大因素就是索引。由于该问题的复杂性，我只可能简单的谈谈这个问题，不过关于这方面的问题，目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQL Server索引，即clustered索引和nonclustered索引。当考察建立什么类型的索引时，你应当考虑数据类型和保存这些数据的column。同样，你也必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型。</p>
<h5>索引的类型</h5>
<p>如果column保存了高度相关的数据，并且常常被顺序访问时，最好使用clustered索引，这是因为如果使用clustered索引，SQL Server会在物理上按升序（默认）或者降序重排数据列，这样就可以迅速的找到被查询的数据。同样，在搜寻控制在一定范围内的情况下，对这些column也最好使用clustered索引。这是因为由于物理上重排数据，每个表格上只有一个clustered索引。</p>
<p>与上面情况相反，如果columns包含的数据相关性较差，你可以使用nonculstered索引。你可以在一个表格中使用高达249个nonclustered索引——尽管我想象不出实际应用场合会用的上这么多索引。</p>
<p>当表格使用主关键字（primary keys），默认情况下SQL Server会自动对包含该关键字的column(s)建立一个独有的cluster索引。很显然，对这些column(s)建立独有索引意味着主关键字的唯一性。当建立外关键字（foreign key）关系时，如果你打算频繁使用它，那么在外关键字cloumn上建立nonclustered索引不失为一个好的方法。如果表格有clustered索引，那么它用一个链表来维护数据页之间的关系。相反，如果表格没有clustered索引，SQL Server将在一个堆栈中保存数据页。</p>
<h5>数据页</h5>
<p>当索引建立起来的时候，SQLServer就建立数据页（datapage），数据页是用以加速搜索的指针。当索引建立起来的时候，其对应的填充因子也即被设置。设置填充因子的目的是为了指示该索引中数据页的百分比。随着时间的推移，数据库的更新会消耗掉已有的空闲空间，这就会导致页被拆分。页拆分的后果是降低了索引的性能，因而使用该索引的查询会导致数据存储的支离破碎。当建立一个索引时，该索引的填充因子即被设置好了，因此填充因子不能动态维护。</p>
<p>为了更新数据页中的填充因子，我们可以停止旧有索引并重建索引，并重新设置填充因子（注意：这将影响到当前数据库的运行，在重要场合请谨慎使用）。<em>DBCC INDEXDEFRAG</em>和<em>DBCC DBREINDEX</em>是清除clustered和nonculstered索引碎片的两个命令。<em>INDEXDEFRAG</em>是一种在线操作（也就是说，它不会阻塞其它表格动作，如查询），而<em>DBREINDEX</em>则在物理上重建索引。在绝大多数情况下，重建索引可以更好的消除碎片，但是这个优点是以阻塞当前发生在该索引所在表格上其它动作为代价换取来得。当出现较大的碎片索引时，<em>INDEXDEFRAG</em>会花上一段比较长的时间，这是因为该命令的运行是基于小的交互块（transactional block）。</p>
<h5>填充因子</h5>
<p>当你执行上述措施中的任何一个，数据库引擎可以更有效的返回编入索引的数据。关于填充因子（fillfactor）话题已经超出了本文的范畴，不过我还是提醒你需要注意那些打算使用填充因子建立索引的表格。</p>
<p>在执行查询时，SQL Server动态选择使用哪个索引。为此，SQL Server根据每个索引上分布在该关键字上的统计量来决定使用哪个索引。值得注意的是，经过日常的数据库活动（如插入、删除和更新表格），SQL Server用到的这些统计量可能已经&#8220;过期&#8221;了，需要更新。你可以通过执行<em>DBCC SHOWCONTIG</em>来查看统计量的状态。当你认为统计量已经&#8220;过期&#8221;时，你可以执行该表格的<em>UPDATE STATISTICS</em>命令，这样SQL Server就刷新了关于该索引的信息了。</p>
<h5>建立数据库维护计划</h5>
<p>SQL Server提供了一种简化并自动维护数据库的工具。这个称之为数据库维护计划向导（Database Maintenance Plan Wizard ，DMPW）的工具也包括了对索引的优化。如果你运行这个向导，你会看到关于数据库中关于索引的统计量，这些统计量作为日志工作并定时更新，这样就减轻了手工重建索引所带来的工作量。如果你不想自动定期刷新索引统计量，你还可以在DMPW中选择重新组织数据和数据页，这将停止旧有索引并按特定的填充因子重建索引。</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/144033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-09-10 16:49 <a href="http://www.blogjava.net/SIDNEY/archive/2007/09/10/144033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计</title><link>http://www.blogjava.net/SIDNEY/archive/2007/09/10/143928.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 10 Sep 2007 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/09/10/143928.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/143928.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/09/10/143928.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/143928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/143928.html</trackback:ping><description><![CDATA[&nbsp;　<a href="http://www.itisedu.com/phrase/200603011123415.html" target="_new">数据库设计</a>(<a href="http://www.itisedu.com/phrase/200604222040295.html" target="_new">Database Design</a>)是指对于一个给定的应用环境，构造最优的<a href="http://www.itisedu.com/phrase/200602271218062.html" target="_new">数据库</a><a href="http://www.itisedu.com/phrase/200603061709535.html" target="_new">模式</a>，建立数据库及其应用系统，使之能够有效地存储数据，满足各种用户的应用<a href="http://www.itisedu.com/phrase/200603101518295.html" target="_new">需求</a>（信息要求和处理要求）。
<p>　　在数据库领域内，常常把使用数据库的各<a href="http://www.itisedu.com/phrase/200603090857555.html" target="_new">类</a>系统统称为数据库应用系统。</p>
<p><strong>一、数据库和<a href="http://www.itisedu.com/phrase/200603011147495.html" target="_new">信息系统</a></strong><br />
　　(1)数据库是信息系统的核心和基础，把信息系统中大量的数据按一定的模型组织起来，提供存储、维护、检索数据的<br />
　&nbsp;&nbsp; 　功能，使信息系统可以方便、及时、准确地从数据库中获得所需的信息。<br />
　　(2)数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在。<br />
　　(3)数据库设计是信息系统开发和建设的重要组成部分。<br />
　　(4)数据库设计人员应该具备的技术和知识：<br />
　　　 　数据库的基本知识和数据库设计技术<br />
　　　　 <a href="http://www.itisedu.com/phrase/200603021438435.html" target="_new">计算机</a>科学的基础知识和<a href="http://www.itisedu.com/phrase/200602281641255.html" target="_new">程序设计</a>的方法和技巧<br />
　　　 　<a href="http://www.itisedu.com/phrase/200602281725525.html" target="_new">软件工程</a>的原理和方法<br />
　　　　 应用领域的知识</p>
<p><strong>二、数据库设计的特点</strong> <br />
　　数据库建设是硬件、<a href="http://www.itisedu.com/phrase/200604232134205.html" target="_new">软件</a>和干件的结合<br />
　　　三分技术，七分管理，十二分基础数据<br />
　　　技术与管理的界面称之为&#8220;干件&#8221;<br />
　　数据库设计应该与应用系统设计相结合<br />
　　　结构（数据）设计：设计数据库<a href="http://www.itisedu.com/phrase/200603061723295.html" target="_new">框架</a>或数据库结构<br />
　　　行为（处理）设计：设计应用<a href="http://www.itisedu.com/phrase/200604232224305.html" target="_new">程序</a>、事务处理等<br />
　　结构和行为分离的设计<br />
　　　传统的软件工程忽视对应用中数据语义的分析和抽象，只要有可能就尽量推迟数据结构设计的决策早期的数据库设计致力于数据模型和建模方法研究，忽视了对行为的设计<br />
　　如图：<br />
</p>
<p align="center"><img src="http://www.itisedu.com/manage/Upload/image/2006327171322129.jpg" border="0"  alt="" /></p>
<p>　　　　　　&nbsp;&nbsp; 　 <br />
<strong>三、数据库设计方法简述</strong> <br />
　　手工试凑法<br />
　　　设计质量与设计人员的经验和水平有直接关系<br />
　　　缺乏科学理论和工程方法的支持，工程的质量难以保证<br />
　　　数据库运行一段时间后常常又不同程度地发现各种问题，增加了维护代价<br />
　　规范设计法<br />
　　　手工设计方<br />
　　　基本思想<br />
　　过程迭代和逐步求精<br />
　　规范设计法(续)<br />
　　典型方法：<br />
　　(1)新奥尔良（New Orleans）方法：将数据库设计分为四个阶段<br />
　　　　S.B.Yao方法：将数据库设计分为五个步骤<br />
　　　　I.R.Palmer方法：把数据库设计当成一步接一步的过程<br />
　　(2)计算机辅助设计<br />
　　　　<a href="http://www.itisedu.com/phrase/200604040935115.html" target="_new">ORACLE</a> Designer 2000<br />
　　　　<a href="http://www.itisedu.com/phrase/200604040934365.html" target="_new">SYBASE</a> PowerDesigner</p>
<p><strong>四、数据库设计的基本步骤</strong><br />
　　数据库设计的过程(六个阶段) <br />
　&nbsp; 1.<a href="http://www.itisedu.com/phrase/200603062220345.html" target="_new">需求分析</a>阶段<br />
　　　准确了解与分析用户需求（包括数据与处理）<br />
　　　是整个设计过程的基础，是最困难、最耗费时间的一步<br />
　　2.概念结构设计阶段<br />
　　　是整个数据库设计的关键<br />
　　　通过对用户需求进行综合、归纳与抽象，形成一个独立于具体<a href="http://www.itisedu.com/phrase/200604221337185.html" target="_new">DBMS</a>的<a href="http://www.itisedu.com/phrase/200604181844195.html" target="_new">概念模型</a><br />
　　3.逻辑结构设计阶段<br />
　　　将概念结构转换为某个DBMS所支持的数据模型<br />
　　　对其进行优化<br />
　　4.数据库物理设计阶段<br />
　　　为逻辑数据模型选取一个最适合应用环境的物理结构（包括存储结构和存取方法）<br />
　　5.数据库实施阶段<br />
　　　运用DBMS提供的数据语言、工具及宿主语言，根据逻辑设计和物理设计的结果<br />
　　　建立数据库，编制与调试应用程序，组织数据入库，并进行试运行<br />
　　6.数据库运行和维护阶段<br />
　　　数据库应用系统经过试运行后即可投入正式运行。<br />
　　　在<a href="http://www.itisedu.com/phrase/200603011056245.html" target="_new">数据库系统</a>运行过程中必须不断地对其进行评价、调整与修改<br />
　　设计特点:<br />
　　　在设计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来将这两个方面的需求分析、抽象、设计、实现在各个阶段同时进行，相互参照，相互补充，以完善两方面的设计</p>
<p>　　设计过程各个阶段的设计描述：<br />
　　如图：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p align="center"><img src="http://www.itisedu.com/manage/Upload/image/2006327171351881.jpg" border="0"  alt="" /></p>
<p><br />
<strong>五、数据库各级模式的形成过程</strong><br />
　　1.需求分析阶段：综合各个用户的应用需求<br />
　　2.概念设计阶段：形成独立于机器特点，独立于各个DBMS产品的概念模式(E-R图)<br />
　　3.逻辑设计阶段：首先将E-R图转换成具体的数据库产品支持的数据模型，如关系模型，形成数据库逻辑模式；然后根据用户处理的要求、安全性的考虑，在基本表的基础上再建立必要的<a href="http://www.itisedu.com/phrase/200603141659315.html" target="_new">视图</a>(View)，形成数据的外模式<br />
　　4.物理设计阶段：根据DBMS特点和处理的需要，进行物理存储安排，建立索引，形成数据库内模式 </p>
<p><strong>六、数据库设计技巧</strong></p>
<p>　　<strong>1. 设计数据库之前（需求分析阶段）</strong><br />
　　1) 理解客户需求，询问用户如何看待未来需求变化。让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。<br />
　　2) 了解企业业务可以在以后的开发阶段节约大量的时间。<br />
　　3) 重视输入输出。<br />
　　在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。<br />
　　举例：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。<br />
　　4) 创建数据字典和ER 图表<br />
　　ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对<a href="http://www.itisedu.com/phrase/200604022014515.html" target="_new">SQL</a> 表达式的文档化来说这是完全必要的。<br />
　　5) 定义标准的<a href="http://www.itisedu.com/phrase/200603090845215.html" target="_new">对象</a>命名规范<br />
　　数据库各种对象的命名必须规范。</p>
<p>　<strong>　2. 表和字段的设计（数据库逻辑设计）</strong><br />
　　表设计原则<br />
　　1) 标准化和规范化<br />
　　数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式，但Third Normal Form（<a href="http://www.itisedu.com/phrase/200604172019525.html" target="_new">3NF</a>）通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说，遵守3NF 标准的数据库的表设计原则是：&#8220;One Fact in One Place&#8221;即某个表只包括其本身基本的属性，当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点：有一组表专门存放通过键连接起来的关联数据。<br />
　　举例：某个存放客户及其有关定单的3NF 数据库就可能有两个表：Customer 和Order。Order 表不包含定单关联客户的任何信息，但表内会存放一个键值，该键指向Customer 表里包含该客户信息的那一行。<br />
　　事实上，为了效率的缘故，对表不进行标准化有时也是必要的。<br />
　　2) 数据驱动<br />
　　采用数据驱动而非硬编码的方式，许多策略变更和维护都会方便得多，大大增强系统的灵活性和扩展性。<br />
　　举例，假如用户界面要访问外部数据源（<a href="http://www.itisedu.com/phrase/200602282323195.html" target="_new">文件</a>、<a href="http://www.itisedu.com/phrase/200604231236585.html" target="_new">XML</a> 文档、其他数据库等），不妨把相应的连接和路径信息存储在用户界面支持表里。还有，如果用户界面执行<a href="http://www.itisedu.com/phrase/200603110944215.html" target="_new">工作流</a>之类的任务（发送邮件、打印信笺、修改记录状态等），那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上，如果过程是数据驱动的，你就可以把相当大的责任推给用户，由用户来维护自己的工作流过程。<br />
　　3) 考虑各种变化<br />
　　在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。<br />
　　举例，姓氏就是如此（注意是西方人的姓氏，比如女性结婚后从夫姓等）。所以，在建立系统存储客户信息时，在单独的一个数据表里存储姓氏字段，而且还附加起始日和终止日等字段，这样就可以跟踪这一数据条目的变化。</p>
<p><br />
　　字段设计原则<br />
　　4) 每个表中都应该添加的3 个有用的字段<br />
dRecordCreationDate，在VB 下默认是Now()，而在<a href="http://www.itisedu.com/phrase/200604040933575.html" target="_new">SQL Server</a> 　　&#8226; 下默认为GETDATE()<br />
sRecordCreator，在SQL Server 下默认为NOT NULL DEFAULT 　　&#8226; USER<br />
nRecordVersion，记录的版本标记；有助于准确说明记录中出现null 数据或者丢失数据的原因 　　&#8226;<br />
　　5) 对地址和电话采用多个字段<br />
　　描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有，电话号码和邮件地址最好拥有自己的数据表，其间具有自身的<a href="http://www.itisedu.com/phrase/200603051002565.html" target="_new">类型</a>和标记类别。<br />
　　6) 使用角色实体定义属于某类别的列<br />
　　在需要对属于特定类别或者具有特定角色的事物做定义时，可以用角色实体来创建特定的时间关联关系，从而可以实现自我文档化。<br />
　　举例：用PERSON 实体和PERSON_<a href="http://www.itisedu.com/phrase/200604231258125.html" target="_new">TYPE</a> 实体来描述人员。比方说，当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位，而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值，同时增加一个日期/时间字段来知道变化是何时发生的。这样，你的PERSON_TYPE 表就包含了所有PERSON 的可能类型，比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化，不过这样一来在时间上无法跟踪个人所处位置的具体时间。<br />
　　7) 选择数字类型和文本类型尽量充足<br />
　　在SQL 中使用smallint 和tinyint 类型要特别小心。比如，假如想看看月销售总额，总额字段类型是smallint，那么，如果总额超过了$32,767 就不能进行计算操作了。<br />
　　而ID 类型的文本字段，比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来<a href="http://www.itisedu.com/phrase/200603121222205.html" target="_new">重构</a>整个数据库就可以实现数据库规模的增长了。<br />
　　8) 增加删除标记字段<br />
　　在表中包含一个&#8220;删除标记&#8221;字段，这样就可以把行标记为删除。在关系数据库里不要单独删除某一行；最好采用清除数据程序而且要仔细维护索引整体性。 </p>
<p>　<strong>　3. 选择键和索引（数据库逻辑设计）</strong><br />
　　键选择原则：<br />
　　1) 键设计4 原则<br />
为关联字段创建外键。 　　&#8226;<br />
所有的键都必须唯一。 　　&#8226;<br />
避免使用复合键。 　　&#8226;<br />
外键总是关联唯一的键字段。 　　&#8226;<br />
　　2) 使用系统生成的主键<br />
　　设计数据库的时候采用系统生成的键作为主键，那么实际控制了数据库的索引完整性。这样，数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点：当拥有一致的键结构时，找到逻辑缺陷很容易。<br />
　　3) 不要用用户的键(不让主键具有可更新性)<br />
　　在确定采用什么字段作为表的键的时候，可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。<br />
　　4) 可选键有时可做主键<br />
　　把可选键进一步用做主键，可以拥有建立强大索引的能力。</p>
<p><br />
　　索引使用原则：<br />
　　索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。<br />
　　1) 逻辑主键使用唯一的成组索引，对系统键（作为存储过程）采用唯一的非成组索引，对任何外键列采用非成组索引。考虑数据库的空间有多大，表如何进行访问，还有这些访问是否主要用作读写。<br />
　　2) 大多数数据库都索引自动创建的主键字段，但是可别忘了索引外键，它们也是经常使用的键，比如运行查询显示主表和所有关联表的某条记录就用得上。<br />
　　3) 不要索引memo/note 字段，不要索引大型字段（有很多字符），这样作会让索引占用太多的存储空间。<br />
　　4) 不要索引常用的小型表<br />
　　不要为小型数据表设置任何键，假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。</p>
<p><strong>　　4. 数据完整性设计（数据库逻辑设计）</strong><br />
　　1) 完整性实现机制：<br />
　　实体完整性：主键<br />
　　参照完整性：<br />
　　父表中删除数据：级联删除；受限删除；置空值<br />
　　父表中插入数据：受限插入；递归插入<br />
　　父表中更新数据：级联更新；受限更新；置空值<br />
　　DBMS对参照完整性可以有两种方法实现：外键实现机制（约束规则）和触发器实现机制<br />
　　用户定义完整性：<br />
　　NOT NULL；CHECK；触发器<br />
　　2) 用约束而非商务规则强制数据完整性<br />
　　采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性；它不能保证表之间（外键）的完整性所以不能强加于其他完整性规则之上。<br />
　　3) 强制指示完整性<br />
　　在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。<br />
　　4) 使用查找控制数据完整性<br />
　　控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找：国家代码、状态代码等。<br />
　　5) 采用视图<br />
　　为了在数据库和应用程序代码之间提供另一层抽象，可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。</p>
<p><strong>　　5. 其他设计技巧</strong><br />
　　1) 避免使用触发器<br />
　　触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器，你最好集中对它文档化。<br />
　　2) 使用常用英语（或者其他任何语言）而不要使用编码<br />
　　在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码，可以在编码旁附上用户知道的英语。<br />
　　3) 保存常用信息<br />
　　让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复（对Access）、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库，当客户抱怨他们的数据库没有达到希望的要求而与你联系时，这样做对非客户机/服务器环境特别有用。<br />
　　4) 包含版本机制<br />
　　在数据库中引入<a href="http://www.itisedu.com/phrase/200603292355295.html" target="_new">版本控制</a>机制来确定使用中的数据库的版本。时间一长，用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 <br />
　　5) 编制文档<br />
　　对所有的快捷方式、命名规范、限制和函数都要编制文档。<br />
　　采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。<br />
　　对数据库文档化，或者在数据库自身的内部或者单独建立文档。这样，当过了一年多时间后再回过头来做第2 个版本，犯错的机会将大大减少。<br />
　　6) 测试、测试、反复测试<br />
　　建立或者修订数据库之后，必须用用户新输入的数据测试数据字段。最重要的是，让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。<br />
　　7) 检查设计<br />
　　在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说，针对每一种最终表达数据的原型应用，保证你检查了数据模型并且查看如何取出数据。<br />
<br />
<font color="#f70938"><font face="黑体"><a href="http://www.itisedu.com/phrase/200604112229525.html" target="_new">中科永联</a>高级技术培训中心（</font><font face="黑体">www.itisedu.com</font></font>)</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/143928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-09-10 11:21 <a href="http://www.blogjava.net/SIDNEY/archive/2007/09/10/143928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何移动SQL Server Tempdb和Master数据库</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/30/141229.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Thu, 30 Aug 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/30/141229.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/141229.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/30/141229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/141229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/141229.html</trackback:ping><description><![CDATA[<h1 class=headtit><a href="http://www.builder.com.cn/" target=_blank><u><font color=#0000ff>开发者在线 Builder.com.cn</font></u></a> 更新时间:<cite>2007-08-15</cite>作者：<span>开发者在线</span> 来源:开发者在线</h1>
<h2 class=headkeyw>本文关键词： <a href="http://www.builder.com.cn/list-0-0-55604-1-1.htm" target=_blank><u><font color=#0000ff>Steven Warren</font></u></a> <a href="http://www.builder.com.cn/list-0-0-48777-1-1.htm" target=_blank><u><font color=#0000ff>数据库</font></u></a> <a href="http://www.builder.com.cn/list-0-0-61412-1-1.htm" target=_blank><u><font color=#0000ff>Tempdb</font></u></a> <a href="http://www.builder.com.cn/list-0-0-61411-1-1.htm" target=_blank><u><font color=#0000ff>Master</font></u></a> <a href="http://www.builder.com.cn/list-0-0-50363-1-1.htm" target=_blank><u><font color=#0000ff>SQL Server</font></u></a> </h2>
<div class=artl_con>
<p>我发现为了提高性能,我们经常需要将数据库和日志文件移动到不同的驱动器上。当要移动典型的用户数据库到一个不同的驱动器上以提高性能或拆分日志时，只要运行sp_detach 和sp_attach来执行移动即可。然而，当涉及到Master和Tempdb数据库的移动时，要使用不同的规则。本文，我们将向大家介绍移动这些数据库的过程。</p>
<p><strong>移动Master</strong><strong>数据库</strong></p>
<p>过去，我曾经将master数据库的日志文件移动到一个不同的驱动器上。如果你也需要执行这个操作，按照下面的规则可以让你成功完成移动操作。首先，右击企业管理器中的SQL Server并选择属性。然后，单击开始参数<a href="http://content.techrepublic.com.com/2346-10877_11-34672.html" target=_blank><u><font color=#0000ff>如图A</font></u></a>所示。正如我们在图A中所看到的，有以下参数出现在对话框中：</p>
<p>-d 是指保存master数据库数据文件的路径全名。</p>
<p>-e 是指保存错误日志文件的路径名。</p>
<p>-l 是指保存master数据库日志文件的路径全名。</p>
<p>现在，如果你要移动文件，那么需要移除当前入口并利用正确的路径重新创建新入口。例如，我们打算将Master数据库日志文件移动到（C:Test）。这样的话，我们将会通过突出高亮显示旧参数并选择移除来删除-l [path]（如<a href="http://content.techrepublic.com.com/2346-10877_11-34672-2.html"><u><font color=#0000ff>图B</font></u></a>所示）。然后，我们将会添加下面的入口（如<a href="http://content.techrepublic.com.com/2346-10877_11-34672-3.html"><u><font color=#0000ff>图C</font></u></a>）-l (c:Testmastlog.ldf)并单击两次确定。现在，将会停止SQL Server并将mastlog.ldf移动到新位置。</p>
<p>注意：请务必确保将mastlog.ldf移动到在开始参数中配置的位置。如果移动到了一个未在开始参数中指明的位置，SQL Server将不能启动。</p>
<p>最后，开启SQL Server,你已经成功地移动了Master数据库，如<a href="http://content.techrepublic.com.com/2346-10877_11-34672-4.html"><u><font color=#0000ff>图D</font></u></a>所示。</p>
<p><strong>移动Tempdb</strong></p>
<p>为了移动tempdb数据库，需要打开查询分析器并运行下面的查询：</p>
<p>Alter database tempdb modify file (name = tempdev, filename = &#8216;E:Sqldata empdb.mdf&#8217;) </p>
<p>go </p>
<p>Alter database tempdb modify file (name = templog, filename = &#8216;E:Sqldata emplog.ldf&#8217;) </p>
<p>Go </p>
<p>要指定的filename=参数取决于要将Tempdb移动到何处。我们将templog移动到(c:est)如图E所示。运行完查询后，重起SQL Server删除旧文件。<strong>&nbsp;</strong></p>
<p><strong>移动MSDB</strong><strong>数据库</strong></p>
<p>移动MSDB和Model数据库，按照下面的步骤进行。首先，右击SQL-Server名并单击属性。在通用选项卡中，选择你的开始参数。然后，输入参数-T3608。单击确定，停止并重起SQL Server。重起之后，分离数据库并将它们移动到合适的位置。</p>
<p>无论何时，当你的驱动器空间变得紧张并需要移动你的系统数据库文件到不同的驱动器上时，按照本文介绍的这些简单操作步骤执行，你将会高效的移动数据库并保证完整性。</p>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/141229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-30 11:00 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/30/141229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# Windows 应用程序中实现 SQL Server 2005 查询通知</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136829.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 15 Aug 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136829.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/136829.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/136829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/136829.html</trackback:ping><description><![CDATA[<div class=author><span class=label>作者</span> &nbsp;<span class=text>Balamurali Balaji MVP</span></div>
<div class="disclaimer mt">
<div class=label>注意：这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度，也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。</div>
</div>
<div class=articleProperty>
<table>
    <tbody>
        <tr>
            <td>文章编号</td>
            <td>:</td>
            <td>555893</td>
        </tr>
        <tr>
            <td>最后修改</td>
            <td>:</td>
            <td>2007年3月27日</td>
        </tr>
        <tr>
            <td>修订</td>
            <td>:</td>
            <td>1.0</td>
        </tr>
    </tbody>
</table>
</div>
<div class=section>
<h2 class=subTitle id=tocHeadRef>概要</h2>
<script type=text/javascript>loadTOCNode(1, 'summary');</script>
<div class=sbody>
<div class=indent><em>本文解释如何在 C# 窗口应用程序中实现 SQL SERVER 2005 查询通知服务。 本文中提供示例代码与 Visual Studio 2005 和 SQL Server Management Studio 2005。</em></div>
<p class=topOfPage><a href="http://support.microsoft.com/kb/555893/zh-cn#top"><img alt="" src="http://support.microsoft.com/library/images/support/en-us/uparrow.gif"><u><font color=#800080>回到顶端</font></u></a></p>
</div>
<h2 class=subTitle id=tocHeadRef>症状</h2>
<script type=text/javascript>loadTOCNode(1, 'Symptoms');</script>
<div class=sbody><strong>简介 </strong><br><br>查询通知是功能允许应用程序要数据已更改时通知 Microsoft SQL Server 2005 中。 它主要用于存储数据库中数据的缓存并获取刷新并通知客户应用 everytime 中数据库中数据更改应用程序。<br><br>ASP.NET 2.0 中开发已经熟悉自己 Web 应用程序以 SQL 数据缓冲区中 &lt; A0 &gt; SqlCacheDependency &lt; / A0 &gt; 类使用。 如由 System.Data.SqlClient 命名空间中 SqlDependency 类提供本文处理高级实现。 它提供之间窗口应用程序和 SQLServer, 使您可以使用相关性来检测服务器中更改简单和一流通知功能。 它有效地利用 SQL Server 2005 通知功能对托管客户应用程序使用 ADO.NET。<br><br>SQL Server 2005 使 ADO.NET Windows 应用程序可以向 SQLServer 发送命令， 请求生成通知如果执行同一 SQL 命令将生成结果集与最初检索不同。 查询通知是受数据库 Service Broker 事件和队列机制。<br><br>
<p class=topOfPage><a href="http://support.microsoft.com/kb/555893/zh-cn#top"><img alt="" src="http://support.microsoft.com/library/images/support/en-us/uparrow.gif"><u><font color=#800080>回到顶端</font></u></a></p>
</div>
<h2 class=subTitle id=tocHeadRef>原因</h2>
<script type=text/javascript>loadTOCNode(1, 'cause');</script>
<div class=sbody><strong>中实现查询通知 step-By-Step 方法 </strong>的整个过程是接收请求通知进程之间客户窗口应用程序和 SQL Server 2005 是五个小步骤中完成如下：<br><br><strong>1) </strong>数据库是问题必须配置为启用查询通知服务。<br><br>出于安全原因, SQL Server 2005 数据库没有默认启用 ServiceBroker。 要启用查询通知对数据库, SQL SERVER 2005 MAnagement VisualStudio, 查询窗口, 中运行以下命令：<br><br>ALTER DATABASE SET ENABLE_BROKER;<br><br>我在本文, 使用 AdvtDB 名<br><br>ALTER DATABASE AdvtDB SET ENABLE_BROKER;<br><br><strong>2) </strong>用户必须具有正确客户和服务器端权限来请求并接收通知。<br>谁执行请求通知必须具有 SUBSCRIBEQUERYNOTIFICATIONS 数据库权限对端 server.Client - 代码部分信任情况中运行命令用户要求 SqlClientPermission。 <br><br><br><br>专用 bool EnoughPermission()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>SqlClientPermission perm = 新 SqlClientPermission.System.Security.permissions.PermissionState.unrestricted;)<br>&nbsp;&nbsp; 尝试<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perm.demand();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回 true ；<br>&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;catch (System.Exception)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回 false ；<br>&nbsp;&nbsp;&nbsp;}<br>}<br><br>3) 使用 SqlCommand 对象来执行与一个关联通知 object&#249;SqlDependency 有效 SELECT 语句。<br><br><br><strong>SqlDependency 对象 </strong>： 查询通知 API 提供 SqlDependency 对象来处理通知。 使用 SqlDependency, ServiceBroker 对象, 例如通知队列, 预定义。 它与它们发布到队列自动启动辅助线程以处理通知 ； 它还分析 ServiceBroker 消息, 公开信息作为事件参数数据。 必须通过调用开始方法来建立相关性到数据库初始化 SqlDependency。 这是静态方法需要为每个数据库连接需要应用初始化期间调用一次。 对于每个依赖连接进行应用程序终止上应调用 Stop 方法。<br><br>建立数据库连接、 SqlDependency 收听通知服务已启动并 DataGridView 控件显示与当前结果返回由命令对象执行查询 Click 的按钮, 上。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 void button1_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ / 删除任何现有相关性连接, 然后创建一个新的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connstr = 数据源 " IntegratedSecurity; 初始目录 " = localhost; = SSPI ； = AdvtDB;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字符串 ssql = 选择 " 从 advt; * "<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDependency.Stop(connstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDependency.start(connstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果 () 连接 = = null<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;连接 = 新 SqlConnection(connstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果 () 命令 = = null<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;命令 = 新 SqlCommand ssql, 连接);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果 () myDataSet = = null<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myDataSet = 新 DataSet();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAdvtData();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>GetAdvtData() 是 Helper 函数创建命令对象实例， 将其与 SqlDependency 对象关联。 注意 SqlDependency 对象有 OnChange 事件通知客户数据库中已进行更改并将负责其 eventhandler dependency_OnChange 的接收部分的通知。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 void GetAdvtData()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myDataSet.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ / 确保命令对象没有通知对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.Notification = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ / 创建并绑定到命令对象 SqlDependency 对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDependency 相关性 = 新 SqlDependency(command);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependency.OnChange += 新 OnChangeEventHandler(dependency_OnChange);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用 (SqlDataAdapter 适配器 = 新 SqlDataAdapter(command))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter.Fill (myDataSet, " Advt ");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataGridView1.DataSource = myDataSet;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataGridView1.DataMember = " advt ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><strong></strong><br>4) 提供代码以处理通知时而且被监视数据更改。<br><br>辅助线程进程封装 OnChange 事件处理程序并且因此, UI changes(updating the datagrid, displaying the status message) 位于主线程不可能访问此处。 创建另一个委托线程 UIDelegate 执行这些任务并让 <br>从 OnChange 事件的 SqlDependency 对象删除辅助线程只处理程序。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;委派 void UIDelegate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 void dependency_OnChange (object sender, SqlNotificationEventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIDelegate uidel = 新 UIDelegate(RefreshData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This.invoke (uidel, null);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Remove 情形处理程序用于将一个通知。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDependency 相关性 = (SqlDependency) 发送者;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dependency.OnChange -= dependency_OnChange;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 void RefreshData()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ / 由于, UI 线程上执行代码可以安全地更新 UI。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label1.Text = " 数据库有一些更改和网格中应用 ";<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/ / 加载数据集绑定到网格。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetAdvtData();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>5) 停止 SqlDependency NotificationServices 退出 application.In form_closing 事件时， 包含用于停止 SqlDepenency 通知侦听器服务代码。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 void Form1_FormClosing(object sender, FormClosingEventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SqlDependency.Stop(connstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果 () 连接 = null !<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>下面是声明该程序中使用。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 const 字符串 statusMessage;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 DataSet myDataSet = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 SqlConnection 连接 = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专用 SqlCommand 命令 = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;私有字符串 connstr;<br><br><br><br>
<p class=topOfPage><a href="http://support.microsoft.com/kb/555893/zh-cn#top"><img alt="" src="http://support.microsoft.com/library/images/support/en-us/uparrow.gif"><u><font color=#800080>回到顶端</font></u></a></p>
</div>
<h2 class=subTitle id=tocHeadRef>解决方案</h2>
<script type=text/javascript>loadTOCNode(1, 'resolution');</script>
<div class=sbody><strong>测试应用程序 </strong><br>运行刚刚按照上述步骤创建 VisualC # Windows 应用程序。 当窗体显示, "-单击该按钮并注意 datagridview 控件被填充。 <br><br>现在, 打开查询窗口是 SQL Server Management 画室式, 和插入行或更新关注表中列。 切换回您运行应用程序, C# 时可能看到数据网格视图中出现更改。<br></div>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/136829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-15 10:08 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/15/136829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005 查询计划指南</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136827.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 15 Aug 2007 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136827.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/136827.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/15/136827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/136827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/136827.html</trackback:ping><description><![CDATA[<p align=center><span></span>&nbsp;</p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>一</span></strong><strong><span><font face="Times New Roman"> &nbsp;</font></span></strong><strong><span>使用背景</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp; </span>1 </font></span><span>应用程序数据库查询性能低下，而我们又无法获得源代码来修改查询文本</span></font></p>
<p><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp; </span>2 </font></span><span>我们不希望直接更改查询文本而又要提高查询性能</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>二</span></strong><strong><span><font face="Times New Roman"> &nbsp;</font></span></strong><strong><span>基本介绍：</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp; </span>SQL Server 2005</font></span><span>引入了称为</span><span><font face="Times New Roman">&#8221;</font></span><span>计划指南</span><span><font face="Times New Roman">&#8221;</font></span><span>的新特性，可以帮我们解决上述问题。本质上，计划指南是通过将查询提示附加到计划指南来影响查询的优化。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>三</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>运作原理：</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>．</span><font face="Times New Roman"> </font><span>当应用程序向</span><span><font face="Times New Roman">Sql Server</font></span><span>发送代码，查询优化器首先检查在缓存中是否有一个适当的询问计划，如果有，查询就按被找到的查询计划执行。</span></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．</span><font face="Times New Roman"> </font><span>如果没有匹配的查询计划，代码将被与一个称为内部查寻表</span><span><font face="Times New Roman">(lookup table)</font></span><span>比较</span><span><font face="Times New Roman">, </font></span><span>看是否有一个已存在的计划指南与之匹配</span></font></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．</span><font face="Times New Roman"> </font><span>如果在第</span><span><font face="Times New Roman">2</font></span><span>步找到匹配的计划指南，询问优化器将修改源代码以包括计划指南中查询提示。源代码中之前的任何查询提示将被新提示替换</span></font></p>
<p><font size=3><span><font face="Times New Roman">4</font></span><span>．</span><font face="Times New Roman"> </font><span>查询计划将被编译和缓存</span></font></p>
<p><font size=3><span><font face="Times New Roman">5</font></span><span>．</span><font face="Times New Roman"> </font><span>查询将按照你之前在计划指南设定的查询提示执行。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>四</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>计划指南的分类：</span></strong><strong></strong></p>
<p><font size=3><span>有三种方式的计划指南：</span><font face="Times New Roman"> </font></font></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>．</span><span><font face="Times New Roman">OBJECT </font></span><span>计划指南：与在</span><span><font face="Times New Roman"> Transact-SQL </font></span><span>存储过程、标量函数、多语句表值函数和</span><font face="Times New Roman"> <span>DML </span></font><span>触发器的上下文中执行的查询匹配。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．</span><span><font face="Times New Roman">SQL </font></span><span>计划指南：与在独立的</span><span><font face="Times New Roman"> Transact-SQL </font></span><span>语句和批处理（不属于数据库对象）的上下文中执行的查询匹配。基于</span><span><font face="Times New Roman"> SQL </font></span><span>的计划指南还可用于与参数化为指定形式的查询匹配。</span><span><font face="Times New Roman">SQL </font></span><span>计划指南适用于应用程序使用</span><span><font face="Times New Roman"> sp_executesql </font></span><span>系统存储过程频繁提交的语句和批处理。</span></font></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．</span><span><font face="Times New Roman">TEMPLATE </font></span><span>计划指南：与参数化为指定形式的独立查询匹配。这些计划指南用于覆盖查询类的数据库的当前</span><span><font face="Times New Roman"> PARAMETERIZATION </font></span><span>数据库</span><span><font face="Times New Roman"> SET </font></span><span>选项。</span></font><a name=sectionToggle2><span><font face="Times New Roman" size=3>TEMPLATE </font></span></a><font size=3><span><span>计划指南用于覆盖特定查询形式的参数化行为。您可以在以下任一情况下创建</span><span><font face="Times New Roman"> TEMPLATE </font></span></span><span><span>计划指南：</span></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>五</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>可以在计划指南使用中的查询提示</span></strong><span><font size=3>：</font></span></p>
<p><span><font face="Times New Roman" size=3>{HASH | ORDER} GROUP </font></span></p>
<p><span><font face="Times New Roman" size=3>{CONCAT | HASH | MERGE} <st1:place w:st="on">UNION</st1:place> </font></span></p>
<p><span><font face="Times New Roman" size=3>{LOOP | MERGE | HASH} JOIN </font></span></p>
<p><span><font face="Times New Roman" size=3>FAST number_rows </font></span></p>
<p><span><font face="Times New Roman" size=3>FORCE ORDER </font></span></p>
<p><span><font face="Times New Roman" size=3>MAXDOP number_of_processors </font></span></p>
<p><span><font face="Times New Roman" size=3>OPTIMIZE FOR ( @variable_name = literal_constant ) [ ,&#8230;n ] </font></span></p>
<p><span><font face="Times New Roman" size=3>RECOMPILE </font></span></p>
<p><span><font face="Times New Roman" size=3>ROBUST PLAN </font></span></p>
<p><span><font face="Times New Roman" size=3>KEEP PLAN </font></span></p>
<p><span><font face="Times New Roman" size=3>KEEPFIXED PLAN </font></span></p>
<p><span><font face="Times New Roman" size=3>EXPAND VIEWS </font></span></p>
<p><span><font face="Times New Roman" size=3>MAXRECURSION number </font></span></p>
<p><span><font face="Times New Roman" size=3>USE PLAN &lt;xmlplan&gt; </font></span></p>
<p><strong><span><font face="Times New Roman">&nbsp;</font></span></strong></p>
<p><strong><span>六</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>使用示例：</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;<span>&nbsp;&nbsp;</span></font></span><span>以下二个存储过程创造和处理计划指南</span></font></p>
<p><span><font size=3><font face="Times New Roman">sp_create_plan_guide </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">sp_control_plan_guide </font></font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font face="Times New Roman"><span><span><font size=3>1．</font>&nbsp;</span></span><span><font size=3>sp_create_plan_guide </font></span></font></p>
<p><span><font size=3>创建用于将查询提示与数据库中的查询进行关联的计划指南</font></span></p>
<p><span><font size=3>语法：</font></span></p>
<p><span><font size=3><font face="Times New Roman">sp_create_plan_guide [ @name = ] N'plan_guide_name' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, [ @stmt = ] N'statement_text' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, [ @type = ] N'{ OBJECT | SQL | TEMPLATE }' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, [ @module_or_batch = ] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N'[ schema_name. ] object_name' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| N'batch_text' <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| NULL <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, [ @params = ] { N'@parameter_name data_type [ ,...n ]' | NULL } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, [ @hints = ] { N'OPTION ( query_hint [ ,...n ] )' | NULL }</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>示例</font></span></p>
<p><span><font size=3><font face="Times New Roman">sp_create_plan_guide </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@name = N'PlanGuideTest', </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@stmt = N'SELECT COUNT(*) AS Total </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">WHERE h.SalesOrderID = d.SalesOrderID and h.OrderDate </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">BETWEEN ''<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="1" month="1" year="2000">1/1/2000</st1:chsdate>'' AND ''1/1/2005'' ', </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@type = N'SQL', </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@module_or_batch = NULL, </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@params = NULL, </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">@hints = N'OPTION (MERGE JOIN)' </font></font></span></p>
<p><span><font size=3><font face="Times New Roman">GO</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>代码的运作原理</font></span></p>
<p><span><font size=3><font face="Times New Roman">@name = N'PlanGuideTest'</font></font></span></p>
<p><font size=3><span>指定计划指南的名称为</span><font face="Times New Roman"> <span>PlanGuide1</span></font></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>@stmt = N'SELECT COUNT(*) AS Total FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID and h.OrderDate <br>BETWEEN "<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="1" month="1" year="2000">1/1/2000</st1:chsdate>" AND "1/1/2005" '</font></span></p>
<p><font size=3><span>这段代码是询问优化器应该匹配的代码。</span><font face="Times New Roman"> </font><span>无论应用程序何时向服务器发送这段代码，询问优化器设法匹配代码。当发现代码和上面列出的匹配时，查询优化器在内部查询表</span><span><font face="Times New Roman">(loolup table)</font></span><span>中查找正确的计划指南，并运用计划指南</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3><font face="Times New Roman">@type = N'SQL',</font></font></span></p>
<p><font size=3><span>说明计划指南的类型，这是一个</span><span><font face="Times New Roman"> SQL </font></span><span>计划指南</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><font face="Times New Roman"><span>@module_or_batch = NULL</span><span>,</span></font></font></p>
<p><font size=3><span>这个代码行用于指定</span><span><font face="Times New Roman">statement_text</font></span><span>对象的名字</span><span><font face="Times New Roman">,</font></span><span>仅在计划指南类型是</span><span><font face="Times New Roman">OBJECT </font></span><span>计划指南时需要</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3><font face="Times New Roman">@params = NULL,</font></font></span></p>
<p><font size=3><span>指定嵌入</span><span><font face="Times New Roman"> statement_text </font></span><span>中的所有参数的定义，在</span><span><font face="Times New Roman">Template </font></span><span>计划指南类型时需要</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3><font face="Times New Roman">@hints = N'OPTION (MERGE JOIN)'</font></font></span></p>
<p><font size=3><span>指定将</span><span><font face="Times New Roman"> OPTION </font></span><span>子句附加到与</span><span><font face="Times New Roman"> @stmt </font></span><span>匹配的查询上</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．</span><span><font face="Times New Roman">sp_control_plan_guide</font></span></font></p>
<p><span><font size=3>删除、启用或禁用计划指南。</font></span></p>
<p><font size=3><span>语法</span></font></p>
<p><span><font size=3><font face="Times New Roman">sp_control_plan_guide [ @operation = ] N'&lt;control_option&gt;' [ , [ @name = ] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N'plan_guide_name' ]</font></font></span></p>
<p><span><font size=3><font face="Times New Roman">&lt;control_option&gt;::=</font></font></span></p>
<p><span><font size=3><font face="Times New Roman">{ </font></font></span></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;DROP <span>&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>--</font></span><span>删除由</span><span><font face="Times New Roman">plan_guide_name </font></span><span>指定的计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;| DROP ALL <span>&nbsp;&nbsp;&nbsp;&nbsp;</span>--</font></span><span>删除当前数据库中的所有计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;| DISABLE <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>--</font></span><span>禁用由</span><span><font face="Times New Roman">plan_guide_name </font></span><span>指定的计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;| DISABLE ALL &nbsp;--</font></span><span>禁用当前数据库中的所有计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;| ENABLE <span>&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;&nbsp;</span>--</font></span><span>启用由</span><span><font face="Times New Roman">plan_guide_name </font></span><span>指定的计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">&nbsp;| ENABLE ALL <span>&nbsp;&nbsp;</span>--</font></span><span>启用当前数据库中的所有计划指南</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>下面是有些例子的是怎样使用这个存储过程</font></span></p>
<p><span><font size=3><font face="Times New Roman">sp_control_plan_guide N'DROP', N'PlanGuideTest' <br>sp_control_plan_guide N'DISABLE', N'PlanGuideTest' <br>sp_control_plan_guide N'ENABLE', N'PlanGuideTest'</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>注：</span><span><font face="Times New Roman"> </font></span><span>如果您设法删除﹑修改﹑一个涉及到计划指南的存储过程﹑函数﹑或</span><span><font face="Times New Roman">DML</font></span><span>触发器，</span><span><font face="Times New Roman"> </font></span><span>它系统将报错。</span><span><font face="Times New Roman"> </font></span><span>必须先删除计划指南</span><span>。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．查看计划指南</span></font></p>
<p><font size=3><span>可以使用</span><span><font face="Times New Roman">sys.plan_guides</font></span><span>目录视图查看数据库中的计划指南</span></font></p>
<p><span><font size=3><font face="Times New Roman">SELECT * FROM sys.plan_guides</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"></font></font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp; </font></span></p>
<p><strong><span>七</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>使用事件探查器验证是否执行计划指南：</span></strong><strong></strong></p>
<p><a name=sectionToggle1><span><font face="Times New Roman"><font size=3>&nbsp;1. </font></font></span></a><font size=3><span><span>启动事件探查器</span><font face="Times New Roman"> </font></span><span><span>跟踪，选中</span><span><font face="Times New Roman">&#8221;</font></span></span><span><span>性能</span><span><font face="Times New Roman">&#8221;-&gt;&#8221;Showplan XML&#8221; </font></span></span><span><span>事件类型。</span></span></font></p>
<p><font size=3><span><span><font face="Times New Roman">2. </font></span></span><span><span>运行查询</span></span></font></p>
<p><font size=3><span><span><font face="Times New Roman">3. </font></span></span><span><span>在</span><span><font face="Times New Roman"> Showplan XML </font></span></span><span><span>事件中查找受影响的查询。</span><span><font face="Times New Roman"> </font></span></span></font></p>
<p><font size=3><span><span><font face="Times New Roman">4. </font></span></span><span><span>如果计划指南的类型为</span><span><font face="Times New Roman"> OBJECT </font></span></span><span><span>或</span><span><font face="Times New Roman"> SQL</font></span></span><span><span>，则验证</span><span><font face="Times New Roman"> Showplan XML </font></span></span><span><span>事件是否包含您希望与查询匹配的计划指南的</span><span><font face="Times New Roman"> PlanGuideDB </font></span></span><span><span>和</span><span><font face="Times New Roman"> PlanGuideName </font></span></span><span><span>属性。或者，如果计划指南的类型为</span><span><font face="Times New Roman"> TEMPLATE</font></span></span><span><span>，则验证</span><span><font face="Times New Roman"> Showplan XML </font></span></span><span><span>事件是否包含预期计划指南的</span><span><font face="Times New Roman"> TemplatePlanGuideDB </font></span></span><span><span>和</span><span><font face="Times New Roman"> TemplatePlanGuideName </font></span></span><span><span>属性。这可以验证计划指南是否在运行。这些属性包含在计划的</span><span><font face="Times New Roman"> &lt;StmtSimple&gt; </font></span></span><span><span>元素下。</span></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>八</span></strong><strong><span><font face="Times New Roman"> &nbsp;</font></span></strong><strong><span>计划指南通常使用的情况：</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>．</span><font face="Times New Roman"> </font><span>在参数化的查询中增加</span><span><font face="Times New Roman">OPTIMIZE FOR or RECOMPILE </font></span><span>询提示</span></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．</span><font face="Times New Roman"> </font><span>用</span><span><font face="Times New Roman">USE PLAN</font></span><span>查询提示强制使用更好的查询计划</span></font></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．</span><font face="Times New Roman"> </font><span>强迫非并行查询使用</span><span><font face="Times New Roman">MAXDOP</font></span><span>查询提示</span></font></p>
<p><font size=3><span><font face="Times New Roman">4</font></span><span>．</span><font face="Times New Roman"> </font><span>强制</span><span><font face="Times New Roman">join</font></span><span>查询试验</span><span><font face="Times New Roman">join</font></span><span>查询提示</span></font></p>
<p><font size=3><span><font face="Times New Roman">5</font></span><span>．</span><font face="Times New Roman"> </font><span>删除，修改，替代现有的查询提示</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><strong><span>九</span></strong><strong><span><span><font face="Times New Roman">&nbsp; </font></span></span></strong><strong><span>最佳实践：</span></strong><strong></strong></p>
<p><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>1</font></span><span>．</span><font face="Times New Roman"> </font><span>计划指南的作用域是创建这些计划指南所用的数据库</span></font></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．</span><font face="Times New Roman"> </font><span>计划指南需要有经验的</span><span><font face="Times New Roman">DBA</font></span><span>才能使用</span></font></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．</span><font face="Times New Roman"> </font><span>如果没有其他方法来解决查询效率问题，请使用一个计划指南</span></font></p>
<p><font size=3><span><font face="Times New Roman">4</font></span><span>．</span><font face="Times New Roman"> </font><span>计划指南需经过测试才正式使用</span></font></p>
<p><font size=3><span><font face="Times New Roman">5</font></span><span>．</span><span><font face="Times New Roman"> Sql Server</font></span><span>版本涉及或打</span><span><font face="Times New Roman">SP</font></span><span>补丁后，需要重新评估计划指南的效率，以确定是否继续使用计划指南</span></font></p>
&nbsp;<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1505218</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/136827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-15 10:05 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/15/136827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库行转列的算法</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/14/136678.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 14 Aug 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/14/136678.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/136678.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/14/136678.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/136678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/136678.html</trackback:ping><description><![CDATA[<p>--各合作机构自年初以来每周报告数量</p>
<p>&nbsp;</p>
<p>select&nbsp; b.f0010 jg,datepart(ww,a.creat_tm) zc,count(*) cnt into #t </p>
<p>&nbsp;</p>
<p>from RPT_D_BSC a,RPT_R_ORG b</p>
<p>&nbsp;</p>
<p>where b.f0040='4' and a.creat_tm&gt;'2007-01-01' and a.org_cl=b.org_cl</p>
<p>&nbsp;</p>
<p>group by b.f0010,datepart(ww,a.creat_tm)</p>
<p>&nbsp;</p>
<p>order by b.f0010,datepart(ww,a.creat_tm)</p>
<p>&nbsp;</p>
<p>declare @sql varchar(8000) </p>
<p>&nbsp;</p>
<p>set @sql = 'select jg as ' + '姓名' </p>
<p>&nbsp;</p>
<p>select @sql = @sql + ', isnull(sum(case zc when ''' + cast(zc as varchar(2)) + ''' then cnt end),0) [' + cast(zc as varchar(2)) + ']' </p>
<p>from (select distinct zc from #t) as a </p>
<p>order by zc</p>
<p><br>set @sql = @sql + 'from #t group by jg order by jg' </p>
<p>--print @sql&nbsp; </p>
<p>exec(@sql) </p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/136678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-14 14:53 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/14/136678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中值</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136453.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 13 Aug 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136453.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/136453.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/136453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/136453.html</trackback:ping><description><![CDATA[<strong>在中间的中值<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中值通常是被用作分析目的来确定在一个分发里的中间值的一个统计计算值。中值的计算会取决于值的输入集是否包含一个奇数或偶数个数的元素而不同。当你有一个奇数个数的元素，并且按时间顺序将值排序时，中值是中间的值。例如：如果你有这个数值集合{30，10，40}，并且把它们按时间顺序排序，中值是30（{10，30，40}的中间值）。在一个偶数个数的元素里（仍然是按时间顺序排序），中值是两个中间的值的平均值。例如：假设有数值集合{30，10，40，10}，那么中值是20（10和30的平均值）。
<img src ="http://www.blogjava.net/SIDNEY/aggbug/136453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-13 17:46 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/13/136453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表变量和临时表</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136382.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 13 Aug 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136382.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/136382.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/13/136382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/136382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/136382.html</trackback:ping><description><![CDATA[基本原则：能用表变量就用表变量。实在不行才使用临时表。<br><strong>如与动态语句结合、外部需要使用等，就需要临时表</strong>。<br><br>表变量主要开销系统的内存，而临时表则使用tempdb。对于小数据量的中间数据存储，可以使用表变量，而当需要临时保存的数据量很庞大时，建议使用临时表。具体使用表变量还是临时表，可以根据系统的运行状况来调整。<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 src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">declare</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">@tb</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">(id&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,name&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span><span style="COLOR: #000000">),age&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">创建表变量</span><span style="COLOR: #008080"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">@tb</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">nn</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">14</span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">union</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">all</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">nn</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">14</span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">@tb</span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;#t(id&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,name&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">varchar</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span><span style="COLOR: #000000">),years&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,nums&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">)</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">创建临时表</span><span style="COLOR: #008080"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;#t&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">nn</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">14</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">15</span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">union</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">all</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">nn</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">14</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">15</span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">insert</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000">&nbsp;#t&nbsp;&nbsp;</span><span style="COLOR: #0000ff">exec</span><span style="COLOR: #000000">&nbsp;sp_gets&nbsp;&nbsp;</span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">可以用于存储过程或动态SQL结合</span><span style="COLOR: #008080"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;#t<br><img src="http://jierry.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">drop</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;#t</span></div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/136382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-13 14:55 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/13/136382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SET NOCOUNT,SET ANSI_NULLS AND SET QUOTED_IDENTIFIER</title><link>http://www.blogjava.net/SIDNEY/archive/2007/08/10/135745.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Fri, 10 Aug 2007 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/08/10/135745.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/135745.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/08/10/135745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/135745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/135745.html</trackback:ping><description><![CDATA[<p>SET&nbsp; NOCOUNT <br><br>SET NOCOUNT<br>使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。</p>
<p>语法<br>SET NOCOUNT { ON | OFF }</p>
<p>注释<br>当 SET NOCOUNT 为 ON 时，不返回计数（表示受 Transact-SQL 语句影响的行数）。当 SET NOCOUNT 为 OFF 时，返回计数。</p>
<p>即使当 SET NOCOUNT 为 ON 时，也更新 @@ROWCOUNT 函数。</p>
<p>当 SET NOCOUNT 为 ON 时，将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft SQL Server 提供的实用工具执行查询时，在 Transact-SQL 语句（如 SELECT、INSERT、UPDATE 和 DELETE）结束时将不会在查询结果中显示"nn rows affected"。</p>
<p>如果存储过程中包含的一些语句并不返回许多实际的数据，则该设置由于大量减少了网络流量，因此可显著提高性能。</p>
<p>SET NOCOUNT 设置是在执行或运行时设置，而不是在分析时设置。</p>
<p>权限<br>SET NOCOUNT 权限默认授予所有用户。</p>
<p>结论：我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话，在退出存储过程的时候加上 SET NOCOUNT OFF这样的话，以达到优化存储过程的目的。</p>
<p>多说两句：</p>
<p>1：在查看SqlServer的帮助的时候，要注意&#8220;权限&#8221;这一节，因为某些语句是需要一定的权限的，而我们往往忽略。</p>
<p>2：@@ROWCOUNT是返回受上一语句影响的行数，包括找到记录的数目、删除的行数、更新的记录数等，不要认为只是返回查找的记录数目，而且@@ROWCOUNT要紧跟需要判断语句，否则@@ROWCOUNT将返回0。</p>
<p>3：如果使用表变量，在条件表达式中要使用别名来替代表名，否则系统会报错。</p>
<p>4：在CUD类的操作中一定要有事务处理。</p>
<p>5：使用错误处理程序，用来检查 @@ERROR 系统函数的 T-SQL 语句 (IF) 实际上在进程中清除了 @@ERROR 值，无法再捕获除零之外的任何值,必须使用 SET 或 SELECT 立即捕获错误代码。<br><br>SET ANSI_NULLS <br><br></p>
<div id=ctl00_LibFrame_ctl09><a name=remarksToggle>
<p>SQL-92 标准要求在对空值进行等于 (=) 或不等于 (&lt;&gt;) 比较时取值为 FALSE。当 SET ANSI_NULLS 为 ON 时，即使 <em>column_name</em> 中包含空值，使用 WHERE <em>column_name</em> = <strong>NULL</strong> 的 SELECT 语句仍返回零行。即使 <em>column_name</em> 中包含非空值，使用 WHERE <em>column_name</em> &lt;&gt; <strong>NULL</strong> 的 SELECT 语句仍会返回零行。</p>
<p>当 SET ANSI_NULLS 为 OFF 时，等于 (=) 和不等于 (&lt;&gt;) 比较运算符不遵从 SQL-92 标准。使用 WHERE <em>column_name</em> = <strong>NULL</strong> 的 SELECT 语句返回 <em>column_name</em> 中包含空值的行。使用 WHERE <em>column_name</em> &lt;&gt; <strong>NULL</strong> 的 SELECT 语句返回列中包含非空值的行。此外，使用 WHERE <em>column_name</em> &lt;&gt; <em>XYZ_value</em> 的 SELECT 语句返回所有不为 <em>XYZ_value</em> 也不为 NULL 的行。</p>
<div class=alert>
<table width="100%">
    <tbody>
        <tr>
            <th align=left><img class=note src="http://technet.microsoft.com/zh-cn/library/ms188048.note(zh-cn,SQL.90).gif">注意： </th>
        </tr>
        <tr>
            <td>SQL Server 是将空字符串解释为单个空格还是解释为真正的空字符串，由兼容级别设置控制。如果兼容级别小于或等于 65，则 SQL Server 会将空字符串解释为单个空格。如果兼容级别等于 70，则 SQL Server 会将空字符串解释为空字符串。有关设置兼容级别的详细信息，请参阅 <a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl10',this);" href="http://technet.microsoft.com/zh-cn/library/ms178653.aspx"><u><font color=#0000ff>sp_dbcmptlevel (Transact-SQL)</font></u></a>。
            <p>&#160;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&#160;</p>
</div>
<p>当 SET ANSI_NULLS 为 ON 时，所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时，如果数据值为 NULL，则所有数据对空值的比较将取值为 TRUE。如果未指定 SET ANSI_NULLS，则应用当前数据库的 <strong>ANSI_NULLS</strong> 选项设置。有关 <strong>ANSI_NULLS</strong> 数据库选项的详细信息，请参阅 <a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl11',this);" href="http://technet.microsoft.com/zh-cn/library/ms174269.aspx"><u><font color=#0000ff>ALTER DATABASE (Transact-SQL)</font></u></a> 和<a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl12',this);" href="http://technet.microsoft.com/zh-cn/library/ms190249.aspx"><u><font color=#0000ff>设置数据库选项</font></u></a>。</p>
<p>仅当某个比较操作数是值为 NULL 的变量或文字 NULL 时，SET ANSI_NULLS ON 才会影响比较。如果比较双方是列或复合表达式，则该设置不会影响比较。</p>
<p>为使脚本按预期运行，不管 <strong>ANSI_NULLS</strong> 数据库选项或 SET ANSI_NULLS 的设置如何，请在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。</p>
<p>在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。</p>
<p>对计算列或索引视图创建或更改索引时，SET ANSI_NULLS 也必须为 ON。如果 SET ANSI_NULLS 为 OFF，则针对表（包含计算列或索引视图的索引）的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误消息，该错误消息会列出所有违反所需值的 SET 选项。另外，在执行 SELECT 语句时，如果 SET ANSI_NULLS 为 OFF，则 SQL Server 将忽略计算列或视图的索引值并解析选择操作，就好像表或视图没有这样的索引一样。</p>
<div class=alert>
<table width="100%">
    <tbody>
        <tr>
            <th align=left><img class=note src="http://technet.microsoft.com/zh-cn/library/ms188048.note(zh-cn,SQL.90).gif">注意： </th>
        </tr>
        <tr>
            <td>ANSI_NULLS 是在处理计算列或索引视图的索引时必须设置为所需值的七个 SET 选项之一。还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON，而必须将 NUMERIC_ROUNDABORT 设置为 OFF。
            <p>&#160;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&#160;</p>
</div>
<p>SQL Server 的 SQL Native Client ODBC 驱动程序和 SQL Native Client OLE DB 访问接口在连接时会自动将 ANSI_NULLS 设置为 ON。该设置可以在 ODBC 数据源、ODBC 连接属性或 OLE DB 连接属性（它们在连接到 SQL Server 实例之前在应用程序中设置）中进行配置。SET ANSI_NULLS 的默认值为 OFF。</p>
<p>当 SET ANSI_DEFAULTS 为 ON 时，将启用 SET ANSI_NULLS。</p>
<p>SET ANSI_NULLS 的设置是在执行或运行时设置，而不是在分析时设置。</p>
</div>
<br><br>SET QUOTED_IDENTIFIER <br><br>
<p>使 SQL Server 2005 遵从关于引号分隔标识符和文字字符串的 SQL-92 规则。由双引号分隔的标识符可以是 Transact-SQL 保留关键字，也可以包含 Transact-SQL 标识符语法约定通常不允许的字符。</p>
<p><img alt=主题链接图标 src="http://technet.microsoft.com/zh-cn/library/ms174393.05b1d166-d807-482c-891f-30b3b6b58046(zh-cn,SQL.90).gif"> <a onclick="javascript:Track('ctl00_LibFrame_ctl05|ctl00_LibFrame_ctl06',this);" href="http://technet.microsoft.com/zh-cn/library/ms177563.aspx">Transact-SQL 语法约定</a></p>
<div class=MTPS_CollapsibleRegion>
<script type=text/Javascript>
var ExpCollDivStr = ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl07ab78d55,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl07img,";
</script>
<a class=CollapseRegionLink onclick="ShowHideCollapsibleArea('ctl00_LibFrame_ctl07ab78d55','ctl00_LibFrame_ctl07img');return false;" href="http://technet.microsoft.com/zh-cn/library/ms174393.aspx#"><img class=CollapseRegionImg id=ctl00_LibFrame_ctl07img alt=语法 src="http://technet.microsoft.com/technet/Controls/CollapsibleArea/en-us/minus.gif" align=middle>语法</a><br>
<div class=section id=ctl00_LibFrame_ctl07ab78d55 style="DISPLAY: block">
<div id=ctl00_LibFrame_ctl07><a name=syntaxToggle>
<div class=code id=ctl00_LibFrame_ctl08_other>
<div class=CodeSnippetTitleBar>
<div class=CodeDisplayLanguage></div>
</div>
<pre class=code id=ctl00_LibFrame_ctl08other space="preserve">SET QUOTED_IDENTIFIER { ON | OFF }</pre>
</div>
</div>
</div>
</div>
<div class=MTPS_CollapsibleRegion>
<script type=text/Javascript>
var ExpCollDivStr = ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl095507af4,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl09img,";
</script>
<a class=CollapseRegionLink onclick="ShowHideCollapsibleArea('ctl00_LibFrame_ctl095507af4','ctl00_LibFrame_ctl09img');return false;" href="http://technet.microsoft.com/zh-cn/library/ms174393.aspx#"><img class=CollapseRegionImg id=ctl00_LibFrame_ctl09img alt=备注 src="http://technet.microsoft.com/technet/Controls/CollapsibleArea/en-us/minus.gif" align=middle>备注</a><br>
<div class=section id=ctl00_LibFrame_ctl095507af4 style="DISPLAY: block">
<div id=ctl00_LibFrame_ctl09><a name=remarksToggle>
<p>当 SET QUOTED_IDENTIFIER 为 ON 时，标识符可以由双引号分隔，而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时，标识符不可加引号，且必须符合所有 Transact-SQL 标识符规则。有关详细信息，请参阅<a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl10',this);" href="http://technet.microsoft.com/zh-cn/library/ms175874.aspx">标识符</a>。文字可以由单引号或双引号分隔。</p>
<p>当 SET QUOTED_IDENTIFIER 为 ON（默认值）时，由双引号分隔的所有字符串都被解释为对象标识符。因此，加引号的标识符不必符合 Transact-SQL 标识符规则。它们可以是保留关键字，并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式，而必须用单引号括住文字字符串。如果单引号 (<strong>'</strong>) 是文字字符串的一部分，则可以由两个单引号 (<strong>"</strong>) 表示。当对数据库中的对象名使用保留关键字时，SET QUOTED_IDENTIFIER 必须为 ON。</p>
<p>当 SET QUOTED_IDENTIFIER 为 OFF 时，表达式中的文字字符串可以由单引号或双引号分隔。如果文字字符串由双引号分隔，则可以在字符串中包含嵌入式单引号，如省略号。</p>
<p>当在计算列或索引视图上创建或更改索引时，SET QUOTED_IDENTIFIER 必须为 ON。如果 SET QUOTED_IDENTIFIER 为 OFF，则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列的索引视图和索引所必需的 SET 选项设置的详细信息，请参阅 <a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl11',this);" href="http://technet.microsoft.com/zh-cn/library/ms190356.aspx">SET (Transact-SQL)</a> 中的&#8220;使用 SET 语句时的注意事项&#8221;。</p>
<p>在进行连接时，SQL 本机客户端 ODBC 驱动程序和 SQL Server 的 SQL Native Client OLE DB Provider 自动将 QUOTED_IDENTIFIER 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。对来自 DB-Library 应用程序的连接，SET QUOTED_IDENTIFIER 默认设置为 OFF。</p>
<p>创建表时，即使此时将 QUOTED IDENTIFIER 选项设置为 OFF，该选项在表的元数据中仍始终存储为 ON。</p>
<p>创建存储过程时，将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置，并用于该存储过程的后续调用。</p>
<p>在存储过程内执行 SET QUOTED_IDENTIFIER 时，其设置不更改。</p>
<p>当 SET ANSI_DEFAULTS 为 ON时，将启用 SET QUOTED_IDENTIFIER。</p>
<p>SET QUOTED_IDENTIFIER 还与 ALTER DATABASE 的 QUOTED_IDENTIFER 设置相对应。有关数据库设置的详细信息，请参阅 <a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl12',this);" href="http://technet.microsoft.com/zh-cn/library/ms174269.aspx">ALTER DATABASE (Transact-SQL)</a> 和<a onclick="javascript:Track('ctl00_LibFrame_ctl09|ctl00_LibFrame_ctl13',this);" href="http://technet.microsoft.com/zh-cn/library/ms190249.aspx">设置数据库选项</a>。</p>
<p>SET QUOTED_IDENTIFIER 是在分析时进行设置的。在分析时进行设置意味着：SET 语句只要出现在批处理或存储过程中即生效，与代码执行实际上是否到达该点无关；并且 SET 语句在任何语句执行之前生效。</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/135745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-08-10 11:04 <a href="http://www.blogjava.net/SIDNEY/archive/2007/08/10/135745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server系统表的应用 </title><link>http://www.blogjava.net/SIDNEY/archive/2007/07/04/128071.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 04 Jul 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/07/04/128071.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/128071.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/07/04/128071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/128071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/128071.html</trackback:ping><description><![CDATA[<p><br>　　在应用SQL&nbsp;Server的基于客户机/服务器体系结构的信息系统开发中，有时需要将后台SQL&nbsp;Server上的某一数据库的表结构都打印出来，以便于开发人员查阅及最终文档的形成。SQL&nbsp;Server本身提供了一个系统存储过程（SP_COLUMNS）,可以完成对单个表结构的查询，只要在SQL&nbsp;Server的ISQL-W工具中键入SP_COLUMNS&nbsp;&#8220;表名&#8221;，并执行即可得到结果集。但该方法有许多不足之处，其主要缺点是：
<p>　　1)&nbsp;只能对单表进行操作，当需要查询一个数据库中所有的表时，需要多次执行SP_COLUMNS&nbsp;，因此显得非常繁琐。
<p>　　2)&nbsp;查询结果集中包含了许多不必要的信息。
<p>　　下面我们创建一个存储过程来完成对某一个数据库中所有表结构的查询。
<p>　　在创建一个数据库的同时，系统会自动建立一些系统表，限于篇幅的缘故我们在这里只介绍与应用实例有关的三个系统表（SYSOBJECTS，SYSCOLUMNS，SYSTYPES）及其相关的字段。
<p>　　表SYSOBJECTS为数据库内创建的每个对象（约束，规则，表，视图，触发器等）创建一条记录。
<p>　　该表相关字段的含义如下：
<p>　　SYSOBJECTS.name&nbsp;对象名，如：表名，视图名。
<p>　　SYSOBJECTS.id&nbsp;对象id。
<p>　　SYSOBJECTS.type&nbsp;对象类型（p存储过程，v视图，s系统表，u用户表）。
<p>　　表SYSCOLUMNS&nbsp;为每个表、视图中的每个列和每个存储过程的每个参数创建一条记录。
<p>　　该表相关字段的含义如下：（此处的列系指数据库中每个表、视图中的列）
<p>　　SYSCOLUMNS.&nbsp;id&nbsp;该列所属的表的id，可与SYSOBJECTS.id相关联
<p>　　SYSCOLUMNS.colid&nbsp;列id，表示该列是表或视图的第几列。
<p>　　SYSCOLUMNS.type&nbsp;物理存储类型，可与SYSTYPES.type相关联。
<p>　　SYSCOLUMNS.length&nbsp;数据的物理长度。
<p>　　SYSCOLUMNS.name&nbsp;列名字，即字段名。
<p>　　SYSCOLUMNS&nbsp;.Pre&nbsp;列的精度级。
<p>　　SYSCOLUMNS&nbsp;.Scale&nbsp;列的标度级。
<p>　　表SYSTYPES&nbsp;为每个系统和每个用户提供的数据类型创建一条记录，如果它们存在，给定域和默认值，描述系统提供的数据类型的行不可更改。
<p>　　该表相关字段的含义如下：
<p>　　SYSTYPES.name&nbsp;数据类型的名字。
<p>　　SYSTYPES.type&nbsp;物理存储数据类型。
<p>　　在SQL&nbsp;SERVER的企业管理器(SQL&nbsp;ENTERPRISE&nbsp;MANAGER)中,选定某一数据库，创建存储过程print_dbstructure。
<p>　　源代码如下:&nbsp;
<p>　　if&nbsp;exists&nbsp;(select&nbsp;*&nbsp;from&nbsp;sysobjects&nbsp;where&nbsp;id&nbsp;=&nbsp;object_id('dbo.&nbsp;print_dbstructure
<p>　　')&nbsp;and&nbsp;sysstat&nbsp;&amp;&nbsp;0xf&nbsp;=&nbsp;4)&nbsp;存储过程
<p>　　drop&nbsp;procedure&nbsp;dbo.&nbsp;print_dbstructure
<p>　　
<p>　　GO
<p>　　CREATE&nbsp;PROCEDURE&nbsp;print_dbstructure
<p>　　
<p>　　AS
<p>　　SELECT&nbsp;DISTINCT&nbsp;sysobjects.name,&nbsp;syscolumns.colid,
<p>　　syscolumns.name,&nbsp;systypes.name,&nbsp;syscolumns.prec,&nbsp;syscolumns.scale
<p>　　FROM&nbsp;syscolumns,&nbsp;sysobjects,&nbsp;systypes
<p>　　WHERE&nbsp;sysobjects.id&nbsp;=&nbsp;syscolumns.id&nbsp;AND&nbsp;systypes.type&nbsp;=&nbsp;syscolumns.type&nbsp;AND&nbsp;((sysobjects.type='u'))
<p>　　
<p>　　GO
<p>　　首先判断是否存在一个名为print_dbstructure的存储过程，如果存在，就摘除它,否则，定义SQL语句建立新的存储过程。从三个系统表中选出满足条件的记录（即该数据库中保存在系统表中的用户表信息）。
<p>　　执行时，在ISQL_W工具中，选定print_dbstructure所在的数据库，执行该存储过程，即可得到结果集（即该数据库中用户表的结构信息）。
<p><br>　SQL&nbsp;Server系统表的推广应用
<p><br>　　以上所介绍存储过程的主要缺陷在于只能对服务器上某一特定的数据库（print_dbstructure所在的数据库）进行查询操作，我们可以通过在SQL&nbsp;Server系统数据库MASTER中建立带有数据库名参数的系统存储过程来解决这一问题　<br></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/128071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-07-04 13:04 <a href="http://www.blogjava.net/SIDNEY/archive/2007/07/04/128071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奇怪的问题 一条 SQL </title><link>http://www.blogjava.net/SIDNEY/archive/2007/04/07/109066.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Sat, 07 Apr 2007 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/04/07/109066.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/109066.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/04/07/109066.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/109066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/109066.html</trackback:ping><description><![CDATA[<p>insert into CTtemp.dbo.SEC_S_SCO_NEW(guid,pub_dt,creat_tm,updt_tm,rmrk,sec_cd,f0010,f0020,f0030,f0040,f0050,f0060,f0070,f0080,f0090,f0100,f0110,f0120,f0130,f0140,f0150,f0160,f0170,f0180,sum1,sum2,sum3,subsum,totalsum,lasttotal)<br>select NEWID() guid, a1.PUB_DT, GETDATE() creat_tm, NULL updt_tm, NULL rmrk, a1.SEC_CD, <br>&nbsp;b1.SCORE F0010, b1.SEGMENT F0020, b2.SCORE F0030, b2.SEGMENT F0040, b3.SCORE F0050, b3.SEGMENT F0060, <br>&nbsp;c1.SCORE F0070, c1.SEGMENT F0080, c2.SCORE F0090, c2.SEGMENT F0100, c3.SCORE F0110, c3.SEGMENT F0120, <br>&nbsp;d1.SCORE F0130, d1.SEGMENT F0140, d2.SCORE F0150, d2.SEGMENT F0160, d3.SCORE F0170, d3.SEGMENT F0180, <br>&nbsp;a2.SCORE Sum1, a3.SCORE Sum2, a4.SCORE Sum3, a5.SCORE SubSUM, a1.SCORE TotalSum,e.SCORE LastTotal&nbsp; <br>FROM CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a1 <br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a2 ON a1.SEC_CD=a2.SEC_CD AND a1.pub_dt=a2.pub_dt AND a2.SCO_ID='0101'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a3 ON a1.SEC_CD=a3.SEC_CD AND a1.pub_dt=a3.pub_dt AND a3.SCO_ID='0102'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a4 ON a1.SEC_CD=a4.SEC_CD AND a1.pub_dt=a4.pub_dt AND a4.SCO_ID='0103'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a5 ON a1.SEC_CD=a5.SEC_CD AND a1.pub_dt=a5.pub_dt AND a5.SCO_ID='0104'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b1 ON a1.SEC_CD=b1.SEC_CD AND a1.pub_dt=b1.pub_dt AND b1.SCO_ID='010101'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b2 ON a1.SEC_CD=b2.SEC_CD AND a1.pub_dt=b2.pub_dt AND b2.SCO_ID='010102'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b3 ON a1.SEC_CD=b3.SEC_CD AND a1.pub_dt=b3.pub_dt AND b3.SCO_ID='010103'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c1 ON a1.SEC_CD=c1.SEC_CD AND a1.pub_dt=c1.pub_dt AND c1.SCO_ID='010201'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c2 ON a1.SEC_CD=c2.SEC_CD AND a1.pub_dt=c2.pub_dt AND c2.SCO_ID='010202'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c3 ON a1.SEC_CD=c3.SEC_CD AND a1.pub_dt=c3.pub_dt AND c3.SCO_ID='010203'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d1 ON a1.SEC_CD=d1.SEC_CD AND a1.pub_dt=d1.pub_dt AND d1.SCO_ID='010301'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d2 ON a1.SEC_CD=d2.SEC_CD AND a1.pub_dt=d2.pub_dt AND d2.SCO_ID='010302'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d3 ON a1.SEC_CD=d3.SEC_CD AND a1.pub_dt=d3.pub_dt AND d3.SCO_ID='010303' <br><span style="COLOR: red">LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT e ON a1.SEC_CD=e.SEC_CD AND e.pub_dt=(SELECT min(PUB_DT) FROM (select top 2 pub_dt from CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT where sco_id='01' order by pub_dt desc) a) AND e.SCO_ID=a1.SCO_ID</span><br>WHERE a1.SCO_ID='01' <br>&nbsp;AND a1.PUB_DT = (SELECT max(PUB_DT) FROM CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT) </p>
<br>----------------<br>出错:<br>消息 8180，级别 16，状态 1，第 1 行<br>未能准备语句。<br>消息 207，级别 16，状态 3，第 1 行<br>列名 'Col2201' 无效。<br>消息 207，级别 16，状态 3，第 1 行<br>列名 'Col2204' 无效。<br><br>把最后left join 改为inner join 就可以了。<br>--------------------------------------------------------------------------------------------------------------------------<br><br>insert into CTtemp.dbo.SEC_S_SCO_NEW(guid,pub_dt,creat_tm,updt_tm,rmrk,sec_cd,f0010,f0020,f0030,f0040,f0050,f0060,f0070,f0080,f0090,f0100,f0110,f0120,f0130,f0140,f0150,f0160,f0170,f0180,sum1,sum2,sum3,subsum,totalsum,lasttotal)<br>select NEWID() guid, a1.PUB_DT, GETDATE() creat_tm, NULL updt_tm, NULL rmrk, a1.SEC_CD, <br>&nbsp;b1.SCORE F0010, b1.SEGMENT F0020, b2.SCORE F0030, b2.SEGMENT F0040, b3.SCORE F0050, b3.SEGMENT F0060, <br>&nbsp;c1.SCORE F0070, c1.SEGMENT F0080, c2.SCORE F0090, c2.SEGMENT F0100, c3.SCORE F0110, c3.SEGMENT F0120, <br>&nbsp;d1.SCORE F0130, d1.SEGMENT F0140, d2.SCORE F0150, d2.SEGMENT F0160, d3.SCORE F0170, d3.SEGMENT F0180, <br>&nbsp;a2.SCORE Sum1, a3.SCORE Sum2, a4.SCORE Sum3, a5.SCORE SubSUM, a1.SCORE TotalSum,e.SCORE LastTotal&nbsp; <br>FROM CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a1 <br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a2 ON a1.SEC_CD=a2.SEC_CD AND a1.pub_dt=a2.pub_dt AND a2.SCO_ID='0101'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a3 ON a1.SEC_CD=a3.SEC_CD AND a1.pub_dt=a3.pub_dt AND a3.SCO_ID='0102'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a4 ON a1.SEC_CD=a4.SEC_CD AND a1.pub_dt=a4.pub_dt AND a4.SCO_ID='0103'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT a5 ON a1.SEC_CD=a5.SEC_CD AND a1.pub_dt=a5.pub_dt AND a5.SCO_ID='0104'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b1 ON a1.SEC_CD=b1.SEC_CD AND a1.pub_dt=b1.pub_dt AND b1.SCO_ID='010101'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b2 ON a1.SEC_CD=b2.SEC_CD AND a1.pub_dt=b2.pub_dt AND b2.SCO_ID='010102'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT b3 ON a1.SEC_CD=b3.SEC_CD AND a1.pub_dt=b3.pub_dt AND b3.SCO_ID='010103'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c1 ON a1.SEC_CD=c1.SEC_CD AND a1.pub_dt=c1.pub_dt AND c1.SCO_ID='010201'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c2 ON a1.SEC_CD=c2.SEC_CD AND a1.pub_dt=c2.pub_dt AND c2.SCO_ID='010202'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT c3 ON a1.SEC_CD=c3.SEC_CD AND a1.pub_dt=c3.pub_dt AND c3.SCO_ID='010203'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d1 ON a1.SEC_CD=d1.SEC_CD AND a1.pub_dt=d1.pub_dt AND d1.SCO_ID='010301'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d2 ON a1.SEC_CD=d2.SEC_CD AND a1.pub_dt=d2.pub_dt AND d2.SCO_ID='010302'<br>LEFT JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT d3 ON a1.SEC_CD=d3.SEC_CD AND a1.pub_dt=d3.pub_dt AND d3.SCO_ID='010303'<br><span style="COLOR: red">INNER JOIN CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT e ON a1.SEC_CD=e.SEC_CD AND e.pub_dt=(SELECT max(PUB_DT) FROM CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT where sco_id=a1.SCO_ID and pub_dt&lt;a1.pub_dt) AND e.SCO_ID=a1.SCO_ID</span> <br>WHERE a1.SCO_ID='01' <br>&nbsp;AND a1.PUB_DT = (SELECT max(PUB_DT) FROM CDW_SRV.WD_10_SEL.dbo.SCORE_D_FACT) 
<img src ="http://www.blogjava.net/SIDNEY/aggbug/109066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-04-07 10:23 <a href="http://www.blogjava.net/SIDNEY/archive/2007/04/07/109066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SQL2005 轻松配置SSIS包</title><link>http://www.blogjava.net/SIDNEY/archive/2007/02/14/99790.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 14 Feb 2007 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/02/14/99790.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/99790.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/02/14/99790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/99790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/99790.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">  
<p> </p><p>在以前的DTS中，在包的开发、测试、发布迁移过程中有很多问题,典型的问题是你必须手动的确定包中的所有连接都指向一个实际存在的物理服务器</p><p>幸运的是，现在在SSIS中提供了这种问题的解决方案，那就是包配置<br />包配置是一个动态改变你的SSIS对象和连接属性的一种机制,它把这些动态可以改变的信息保存在包的外部，有下面几种方法存储这些值并将其传送到包中：<br /> XML文件<br /> 环境变量<br /> 注册表键值<br /> 父包变量</p><p>下面我们将举例使用XML文件存储这些值</p><p>这个例子我们将会把一个文本文件导入到数据库的表中，并可以动态配置数据库的位置来源</p><p>首先开始我们的包的建立：<br /> 假设存在一文本文件 PersonAge.txt，内容如下：<br />  1,Joe Bloggs,27<br />  2,Mary Smith,26<br />  3,Fred Jones,28<br /> 目标表为dbo.PersonAge，使用下面代码建立 <br />  CREATE TABLE [dbo].[PersonAge](<br />   [PersonAgeKey] [int] NULL,<br />   [Person] [varchar](35) NULL,<br />   [PersonAge] [int] NULL<br />  ) ON [PRIMARY]<br />  GO<br /> 下面开始拖曳组件到控制流面板<br />   。一个Execute SQL task组件,命名为Truncate destination. 其 SQL 命令为 TRUNCATE TABLE dbo.PersonAge. <br />   。一个数据流组件，命名为Import File. <br />   。然后把2者关联起来<br /> <br />   <img alt="" src="http://www.sqlis.com/images/26image002.jpg" /><br /> <br />  下面开始设计【Import File】数据流任务<br />   。一个 Flat File connection 组件指向PersonAge.txt文件 <br />   。一个 OLE DB Connection 组件指向存在dbo.PersonAge表的数据库 ，然后配置列的属性，使表跟文件对应起来<br />      <br />   <img alt="" src="http://www.sqlis.com/images/26image004.jpg" /><br />  <br />  到现在为止，已经成功的建立了包</p><p>设置包配置<br />  现在开始设置包配置，这是非常简单的且具有很好的弹性<br />  包配置使你能编辑你的包的属性、变量、连接和你的控制流的其他属性，需要注意的是，你不能编辑你的数据流组件的属性<br />  <br />  在菜单条上，单击DTS, Package Configurations… 或者在控制流设计面板右键选择Package Configurations…. <br />  然后在包配置中允许包配置选择，并单击添加<br />  在单击过后出现一个欢迎屏幕并让你选择配置类型，当前选择XML Configuration File<br />  然后键入配置文件名，如C:\PackageConfigurations\Environment.dtsConfig，单击下一步<br />  然后在对象树浏览中选择Connections.Destination.Properties的InitialCatalog 和 ServerName属性，然后单击下一步<br />  给你的配置一个名字，这样整个过程就完成了<br />  <br />这样你的包将在运行期间获得2个属性的值，你打开XML配置文件，你将看得这些你需要动态改变属性的当前值  </p><p>现在，你可以非常容易的迁移包到另一个新的环境，而你只须改变你的包配置文件（C:\PackageConfigurations\Environment.dtsConfig）即可</p><p><br />英文来源：<a href="http://www.sqlis.com/default.aspx?26">http://www.sqlis.com/default.aspx?26</a></p></span>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/99790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-02-14 10:51 <a href="http://www.blogjava.net/SIDNEY/archive/2007/02/14/99790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中的全文检索</title><link>http://www.blogjava.net/SIDNEY/archive/2007/02/01/97289.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Thu, 01 Feb 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2007/02/01/97289.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/97289.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2007/02/01/97289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/97289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/97289.html</trackback:ping><description><![CDATA[
		<p>原帖地址:http://community.csdn.net/Expert/topic/3295/3295983.xml?temp=.6606409</p>
		<p>全文索引和查询概念(摘自SQL 联机帮助)</p>
		<p>全文索引、查询和同步化最主要的设计要求是，在注册进行全文检索的所有表上都有一个唯一的全文键列（或者单列主键）。全文索引对使用的重要字及其所在位置进行跟踪。</p>
		<p>例如，假定有一个对 DevTools 表的全文索引。全文索引可能指出在 Abstract 列的第 423 个和第 982 个单词处找到了单词 Microsoft，所在的行与 ProductID 6 关联。该索引结构支持对所有包含被索引单词的项进行有效检索，以及高级检索操作，如短语检索和邻近检索。</p>
		<p>为防止全文索引因包含很多对检索没有帮助的词而变得臃肿，a、and、is 或 the 这类额外的词都忽略不计。例如，指定"the products ordered during these summer months"与指定"products ordered during summer months"是一样的。有这两个字符串的行都会被返回。</p>
		<p>目录 \Mssql\Ftdata\Sqlserver\Config 下提供了多种语言的干扰词列表。在安装带有全文检索支持的 Microsoft&amp;reg; SQL Server&amp;#8482; 时会创建这个目录，并同时安装干扰词文件。干扰词文件可以编辑。例如，高技术公司的系统管理员可以把单词 computer 添加到他们的干扰词表中去。（如果编辑干扰词文件，则必须在更改生效之前重新填充全文目录。）下表显示了干扰词文件及其相应的语言。</p>
		<p>干扰词文件      语言 <br />-------------- ---------<br />Noise.chs      简体中文 <br />Noise.cht      繁体中文 <br />Noise.dat      语言中性 <br />Noise.deu      德语 <br />Noise.eng      英语（英国） <br />Noise.enu      英语（美国） <br />Noise.esn      西班牙语 <br />Noise.fra      法语 <br />Noise.ita      意大利语 <br />Noise.jpn      日语 <br />Noise.kor      韩文 <br />Noise.nld      荷兰语 <br />Noise.sve      瑞典语 </p>
		<p>
				<br />在处理全文查询时，检索引擎将满足检条件的行的键值返回给 Microsoft SQL Server。比如有一个 SciFi 表，其中 Book_No 列是主键列。</p>
		<p>Book_No   Writer     Title <br />-------- ----------- --------------------------<br />A025     Asimov      Foundation's Edge <br />A027     Asimov      Foundation and Empire <br />C011     Clarke      Childhood's End <br />V109     Verne       Mysterious Island </p>
		<p>
				<br />假定想使用一个全文检索查询来查找包含单词 Foundation 的书名。在本例中，将从全文索引获得值 A025 和 A027。然后 SQL Server 用这些键值和其它栏的信息响应该查询。</p>
		<p>下表显示了存储全文索引数据所使用的语言。这些语言基于 SQL Server 安装期间选择的 Unicode 排序规则区域设置标识符。</p>
		<p>Unicode 排序规则区域设置标识符    全文数据存储所用的语言 <br />------------------------------- -----------------------<br />中文注音符号（台湾）              繁体中文  <br />汉语拼音                         简体中文  <br />中文笔画                         简体中文  <br />中文笔画（台湾）                 繁体中文  <br />荷兰语                           荷兰语  <br />英语（英国）                     英语（英国）  <br />法语                            法语  <br />通用 Unicode                    英语（美国）  <br />德语                            德语  <br />德文电话簿                       德语  <br />意大利语                         意大利语  <br />日语                            日语  <br />日语 Unicode                    日语  <br />韩文                            韩文  <br />韩文 Unicode                    韩文  <br />西班牙语（现代）                 西班牙语  <br />瑞典/芬兰语                      瑞典语  </p>
		<p>
		</p>
		<p>此列表中没有的其它所有 Unicode 排序规则区域设置标识符值都映射到使用空格分隔单词的中性语言单词的断字符和词干分隔符。</p>
		<p>说明  Unicode 排序规则区域设置标识符设置用于所有可进行全文索引的数据类型（如 char、nchar 等）。如果为 char、varchar 或 text 类型列的排序次序设置的语言类型，不是 Unicode 排序规则区域设置标识符语言，那么在对 char、varchar 和 text 类型的列进行全文索引和查询时，仍然使用 Unicode 排序规则区域设置标识符值。</p>
		<p>创建全文索引(以索引image列为例,其他类型字段大致一样)</p>
		<p>标题     全文索引image列，全攻略！<br />作者     pengdali [原作]  <br />关键字   全文索引 image </p>
		<p>
				<br /> 今天“百年不遇”的停电了，看了一天书。晚上搞了一下全文索引，决定把心得贴出来，我尽量写的详细，大家共同学习，欢迎指正！</p>
		<p>1、启动 Microsoft Search 服务<br />   开始菜单--&gt;SQL程序组--&gt;服务管理器--&gt;下拉筐--&gt;Microsoft Search 服务--&gt;启动它</p>
		<p>2、<br />  ..\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目录里建一个非空noise.chs文件<br />  非空noise.chs文件，也有人说是空的noise.chs文件，但我每次都往里写几个没用的字母。</p>
		<p>3、建立环境<br />   打开查询分析器--&gt;执行下列脚本：<br />--------------------------------------------<br />create database test ---创建test数据库<br />use test             ---选择test数据库<br />create table  dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---创建dali表<br />--dali表中 Id,MyImage,FileType 三列是必须的，因为要对image列索引的话，必须要有一个主键列，一个image列,一个存放文件类型的列<br />--我们知道在windows系统中文件类型是靠扩展名来区分的所以FileType列也就是用来放 文件的扩展名<br />--------------------------------------------</p>
		<p>sp_fulltext_database 'enable' --为全文索引启用数据库<br />sp_fulltext_catalog 'My_FullDir', 'create'  ---创建一个叫My_FullDif的全文目录</p>
		<p>declare @Key sysname ; select @Key=c.name from syscolumns a,sysconstraints b,sysobjects c where a.id=object_id('dali') and a.name='ID' and a.id=b.id and b.constid=c.id and c.name like 'PK%'<br />exec sp_fulltext_table 'dali','create','My_FullDir',@Key  ----这两句是为全文索引,对表进行标记</p>
		<p>sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType'  ---这句是指定MyImage列为全文索引列,FileType是类型列<br />------------------------------------------------<br />4、在c盘下放一个扩展名为doc的word文件,一个扩展名为xls的excel文件,一个扩展名为htm的网页文件,个扩展名为bmp的图片<br />   共4个，大家可根据实际情况放入！</p>
		<p>5、插入数据<br />  建立下面这个存储过程<br />--------------------------------------------------<br />CREATE PROCEDURE sp_textcopy <br />  @srvname    varchar (30), <br />  @login      varchar (30), <br />  @password    varchar (30), <br />  @dbname      varchar (30), <br />  @tbname      varchar (30), <br />  @colname    varchar (30), <br />  @filename    varchar (30), <br />  @whereclause varchar (40), <br />  @direction  char(1) <br />AS <br />/* 这是使用textcopy工具将文件插入到数据库中，如果有前台工具可以用前台开发工具将文件插入，这里为了演示 */<br />DECLARE @exec_str varchar (255) <br />SELECT @exec_str='textcopy /S <a href="mailto:'+@srvname+'">'+@srvname+'</a> /U <a href="mailto:'+@login+'">'+@login+'</a> /P <a href="mailto:'+@password+'">'+@password+'</a> /D <a href="mailto:'+@dbname+'">'+@dbname+'</a><a>/T'+@tbname+'</a> /C <a href="mailto:'+@colname+'">'+@colname+'</a> /W"<a href="mailto:'+@whereclause+'">'+@whereclause+'</a>" /F"<a href="mailto:'+@filename+'">'+@filename+'</a>" <a>/'+@direction</a><br />EXEC master..xp_cmdshell @exec_str<br />----------------------------------------------------</p>
		<p>insert dali values(1,0x,'doc','大力的doc') ---其中第二列是 0x 它是一个16进制数对应image列,是必须的,不要写null,第三列是文件类型，既扩展名</p>
		<p>sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\大力的doc.doc','where ID=1','I'<br />-------依次参数是：实例名,用户名,密码，数据库名，表名，image列名，路径及文件名，条件(你必须保证它只选择一行)，I<br />---------------------------------------------------------------------------------------------------------------------<br />insert dali values(2,0x,'bmp','图片')<br />sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\图片.bmp','where ID=2','I' --注意条件是 ID=2</p>
		<p>insert dali values(3,0x,'xls','Excel文件')<br />sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\Excel文件.xls','where ID=3','I' --注意条件是 ID=3</p>
		<p>insert dali values(4,0x,'htm','网页')<br />sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\网页.htm','where ID=4','I' --注意条件是 ID=4</p>
		<p>----------上面的语句,要保证类型一样，路径正确，条件唯一正确应该就可以了</p>
		<p>6、填充全文索引</p>
		<p>sp_fulltext_table 'dali','start_full' ---第一个参数是表名，第二个参数是启动表的全文索引的完全填充</p>
		<p>7、可以开始你的实验了</p>
		<p>select * from dali where contains(MyImage,'J老师')</p>
		<p>select * from dali where contains(MyImage,'海老师')</p>
		<p>------END----------<br />--调试环境：SQLServer2000企业版、Windows2000高级服务器</p>
		<p>全文索引中的几个问题:</p>
		<p>1.搜索时出现错误:<br />  服务器: 消息 7619，级别 16，状态 1，行 2<br />  查询子句只包含被忽略的词</p>
		<p>  这种情况修改 \Mssql\Ftdata\Sqlserver\Config 下对应语言的干扰词列表文件</p>
		<p>2.修改了干扰词文件,查询中文时仍然出现上述问题<br />  a.首先检查你的SQL有没有安装最新的补丁,检查的方法是在查询分析器中运行:<br />    select @@version<br />    如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上.</p>
		<p>    SQL补丁下载:<br />    <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=9032f608-160a-4537-a2b6-4cb265b80766">http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=9032f608-160a-4537-a2b6-4cb265b80766</a></p>
		<p>    注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装<br /> <br />  b.配置全文索引时,单词断字符选择"中文(中国)"</p>
		<p>  c.Noise.chs文件中至少有一个单词,例如:?</p>
		<p>  d.如果在全文检索时,你能正常修改干扰词文件,说明你的全文检索没有使用上这个文件<br />    如果你配置的全文检索应该要用到这个文件,那就在<br />    企业管理器--展开你的数据库--右键全文目录--重建全部全文目录</p>
		<p>3.表中的数据改变后,检索不到<br />  方法1. 右键你的表--全文索引表--启用增量填充<br />  方法2. 右键你的表--全文索引表--更改跟踪,这样以后的修改会自动填充(有一定延迟)</p>
		<p>4.sql2000才支持对image列的全文检索</p>
		<p>熟悉了以下存储过程，对全文索引就比较熟练了</p>
		<p>全文检索过程 --摘自联机丛书<br />sp_fulltext_catalog sp_help_fulltext_catalogs_cursor <br />sp_fulltext_column sp_help_fulltext_columns <br />sp_fulltext_database sp_help_fulltext_columns_cursor <br />sp_fulltext_service sp_help_fulltext_tables <br />sp_fulltext_table sp_help_fulltext_tables_cursor <br />sp_help_fulltext_catalogs </p>
		<p>FreeTableText 主要是用来做模糊查询的:</p>
		<p>
				<a href="http://www.microsoft.com/china/msdn/archives/library/dnsql2k/html/sql_fulltextsearch.asp">http://www.microsoft.com/china/msdn/archives/library/dnsql2k/html/sql_fulltextsearch.asp</a>
				<br />
		</p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=388810<br /><br /><br /><br />EXEC sp_fulltext_table 'tMotifTalbe_D(表名)', 'drop'--删除表索引<br />EXEC sp_help_fulltext_catalogs --查看索引目录及名称<br />EXEC sp_fulltext_catalog 'Motif(索引名称)', 'drop(动作)'  --删除全文目录</p>
		<p>exec sp_fulltext_catalog 'Motif(索引名称)', 'create(动作)', 'e:\web_data\zsk_data(存放物理路径)' --创建全文录<br />exec sp_fulltext_table 'tMotifTalbe_D(表名)', 'create(动作)', 'Motif(索引名称)','PK_tMotifTalbe_D(单健索引名称)'  --创建索引约束<br />exec sp_fulltext_column 'tMotifTalbe_D(表名)', 'KTitles(字段名)', 'add(动作)'--添加全文索引列<br /><br /></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/97289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2007-02-01 15:25 <a href="http://www.blogjava.net/SIDNEY/archive/2007/02/01/97289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每个代码总量前5个的均值</title><link>http://www.blogjava.net/SIDNEY/archive/2006/12/02/84977.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Sat, 02 Dec 2006 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/12/02/84977.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/84977.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/12/02/84977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/84977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/84977.html</trackback:ping><description><![CDATA[
		<p>DECLARE @temp table(CODE int,TOTALAMOUNT int)<br />declare @code int<br />declare row_cur scroll cursor for<br />select distinct code from dbo.His_Day_1 order by code<br />open row_cur<br />fetch first from row_cur into @code <br />while @@fetch_status=0<br /> begin<br />  insert into @temp(code,totalamount)<br />  select code,avg(totalamount) from  <br />  (select top 5 code,totalamount from dbo.His_Day_1 where <a href="mailto:code=@code">code=@code</a> order by time desc) a group by code <br />  fetch next from row_cur into @code <br /> end<br />close row_cur<br />deallocate row_cur</p>
		<p>select * from @temp order by code </p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/84977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-12-02 11:14 <a href="http://www.blogjava.net/SIDNEY/archive/2006/12/02/84977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005的十大最新特性</title><link>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75588.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 17 Oct 2006 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75588.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/75588.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/75588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/75588.html</trackback:ping><description><![CDATA[
		<p>　　在商界，每样东西都在竞争中争取“更好、更快、更便宜”——SQL Server 2005也提供了很多个新特性来节省精力、时间和金钱。从编程到管理能力，这个版本的SQL Server都优于其他版本的产品，并且它还对SQL Server 2000中已经存在的特性进行了加强。这里我按照它的重要程度列出前十个最重要的新特性。</p>
		<p>　　1、加强的T-SQL (事务处理SQL )</p>
		<p>　　T-SQL 天生就是基于集合的关系型数据库管理系统编程语言，可以提供高性能的数据访问。现在，它与许多新的特性相结合，包括通过同时使用TRY和CTACH来进行错误处理，可以在语句中返回一个结果集的通用表表达式(CTEs)，以及通过PIVOT 和UNPIVOT命令将列转化为行和将列转化为行的能力。<br /><br />　　2、CLR(Common Language Runtime，通用语言运行时)</p>
		<p>　　SQL Server 2005中的第二个主要的增强特性就是整合了符合.NET规范的语言 ，例如C#, ASP.NET 或者是可以构建对象(存储过程，触发器，函数等)的 VB.NET。这一点让你可以在数据库管理系统中执行.NET代码以充分利用.NET功能。它有望在SQL Server 2000环境中取代扩展的存储过程，同时还扩展了传统关系型引擎功能。</p>
		<p>　　3、服务代理(Service Broker)</p>
		<p>　　服务代理处理的是以松散方式进行联系的发送者和接收者之间的消息。一个消息被发送、处理和回答，完成整个事务。这大大扩展了数据驱动应用程序的性能，以符合工作流或者客户业务需求。<br /><br />　　4、数据加密</p>
		<p>　　SQL Server 2000没有用来在表自身加密数据的有文档记载的或者公共支持的函数。企业需要依赖第三方产品来满足这个需求。SQL Server 2005自身带有支持对用户自定义数据库中存储的数据进行加密的功能。</p>
		<p>　　5、SMTP邮件</p>
		<p>　　在SQL Server 2000中直接发送邮件是可能的，但是很复杂。在SQL Server 2005中，微软通过合并SMTP邮件提高了自身的邮件性能。SQL Server从此跟Outlook说“bye-bye”!</p>
		<p>　　6、HTTP终端</p>
		<p>　　你可以很轻松地通过一个简单的T-SQL 语句使一个对象可以在因特网上被访问，从而创建一个HTTP终端。这允许从因特网上呼叫一个简单的对象来获取需要的数据。</p>
		<p>　　7、多活动结果集(Multiple Active Result Sets ，简称MARS)</p>
		<p>　　多活动结果集允许从单个的客户端到数据库保持一条持久的连接，以便在每个连接上拥有超过一个的活动请求。这是一个主要的性能改善，它允许开发人员让用户在使用SQL Server工作的时候拥有新的能力。例如，它允许多个查询，或者一个查询的同时输入数据。底线就是一个客户端连接可以同时拥有多个活动的进程。</p>
		<p>　　8、专用管理员连接</p>
		<p>　　如果所有的内容都出错了，那么只能关闭SQL Server服务或者按下电源键。专用管理员连接结束了这种状况。这个功能允许数据库管理员对SQL Server发起单个诊断连接，即使是服务器正在出现问题。</p>
		<p>　　9、SQL Server综合服务(SSIS)</p>
		<p>　　SSIS已经作为主要的ETL(抽取、传输和载入)工作替代了DTS(数据传输服务)，并且随着SQL Server免费发布。这个工具，从SQL Server 2000开始被完全重新编写，现在已经拥有了很大程度的灵活性，来满足复杂的数据移动需求。　</p>
		<p>　　10、数据库镜像</p>
		<p>　　我并没有指望这个功能会在11月份的RTM 中随着SQL Server 2005一起发布，但是我认为这个特性具有很大的潜力。数据库镜像是本地高可用性能力的扩展。所有，仍然在对更多的细节进行调整……那么现在，祝福吧。</p>
		<p>　　还有两项技术不能在SQL Server 2005的前十列表中遗漏的是它的分析服务和报告服务。虽然SQL Server 2005没有介绍其中的任何一项，但是将它们整合进了SQL Server综合服务之中，以求微软的核心商务智能套件的完美。这些技术对于商务智能的成功至关重要。学习新的特性，以及企业如何在实际项目中实现它。<br /><br />Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1330538</p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/75588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-10-17 13:29 <a href="http://www.blogjava.net/SIDNEY/archive/2006/10/17/75588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2005：你应该知道的13件事情</title><link>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75585.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Tue, 17 Oct 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75585.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/75585.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/10/17/75585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/75585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/75585.html</trackback:ping><description><![CDATA[
		<p>微软的SQL Server 2005正式版的推出已经将近一年的时间。随着最近两份研究报告的出炉，SQL Server 2005又引起了业界的关注和评论——微软凭借SQL Server 2005取得了超过Oracle和IBM数据库产品市场占有率的增长速度。但是，对于不足一岁的SQL Server 2005，还有一些你应该知道的事情，在本文中列举了关于SQL Server 2005你应该知道的13件事情。 </p>
		<p>    SQL Server 2005新增的功能 </p>
		<p>    1. 新的产品版本 </p>
		<p>    除SQL Server 2005标准版和企业版之外，产品线中还加入了SQL Server 2005简化版（SQL Server 2005 Express）和工作组版（SQL Server 2005 Workgroup）两个新版本。 </p>
		<p>    SQL Server 2005 Express——其作用是代替微软SQL Server桌面引擎（Microsoft SQL Server Desktop Engine，MSDE）。SQL Server 2005 Express可以用于自由发布，并与SQL Server使用同样的关系数据库核心引擎。不同的是它并不像MSDE一样使用查询管理器。仅有的限制是一个CPU，1G的内存和每个数据库4G的存储空间。 </p>
		<p>    SQL Server 2005——工作组版不是自由发布的。它的设计着眼点在于服务器消息块协议（SMB）和分部门解决方案。在量化性能上，它更优于SQL Server 2005 Express，并能提供关系数据库的支持，只是缺少分析服务。工作组版限用于两个CPU，3G内存，数据库大小不限。 </p>
		<p>    2. 新的子系统 </p>
		<p>    在一些新的子系统的推动下，SQL Server 2005中的应用程序支持非常强大，其中包括整合服务、提醒服务、服务代理和报告服务。 </p>
		<p>    整合服务——与之前负责此功能的DTS相比，速度快600%。SQL Server整合服务是拥有强大的工作流控制能力的企业级ETL平台。 </p>
		<p>    提醒服务——可以提供搭建自定义提醒程序的应用框架。 </p>
		<p>    服务代理——为建立高度量化程序提供异步进程处理功能。 </p>
		<p>    报告服务——这是最值得升级的一项功能。报告服务是企业级的报告生成平台，可以对设计、布署、销售进行详细的报告。强大的ReportBuilder组件可以让最终用户也享受到报告服务。 </p>
		<p>    3.整合全新的.NET Framework </p>
		<p>    对SQL Server 2005进行的最大的强化就是整合了.NET Framework。启用新的.NET整合功能后，你可以轻松地创建存储过程、函数、触发器、自定义类型、自定义数据集。你可以在任何.NET语言下使用EXEC sp_configure ‘clr enabled' , ‘1'命令启用CLR支持。如果你还在使用过去的未管理的扩展存储过程，应该立即用SQLCLR存储过程代替。 </p>
		<p>    3. 新的数据类型 </p>
		<p>    SQL Server 2005中添加了两种新的数据类型：xml和varbinary(max)。 </p>
		<p>    Xml数据类型——可以用于在SQL Server数据库中存储类型化或非类型化的XML数据，并通过Xquery进行查询。 </p>
		<p>    Varbinary(max)数据类型——可以像访问普通数据一样对图像等二进制数据进行存储和读取。 </p>
		<p>    4. 新的点对点事务型映射 </p>
		<p>    通过SQL Server 2005中的新功能，我们可以轻松掌握微软对映射作出的这一最大改动。点对点事务型映射是针对双向映射设计的，可以使两个或多个数据库之间在任意一个确认产生改动时保持同步。 </p>
		<p>
				<br />SQL Server 2005缺少的功能 </p>
		<p>    6.数据镜像 </p>
		<p>    毫无疑问，数据镜像是自从SQL Server于2005年11月发布的RTM版本以来一直被人想念的功能，因为它是使企业下定决心升级至SQL Server 2005的主要原因之一。预计这一功能会在2006年下半年重新加入。 </p>
		<p>    7.SQL快速管理器 </p>
		<p>    快速管理器试图为SQL Server 2005 Express提供图形化的管理界面。然而它的功能有限，运行缓慢，微软不得不在SQL Server Management Studio中放弃了它，并重新命名为Express。 </p>
		<p>    如何找到SQL Server 2005的这些功能? </p>
		<p>    如果你是第一次使用SQL Server 2005，或许会被大量的新功能和界面改动弄得眼花缭乱。与任何一个版本相比，SQL Server 2005所做出的改动都是最大的。你会发现在SQL Server 2000或SQL Server 7中习惯使用的工具都被修改或去除了。 </p>
		<p>    8.SQL Server服务管理器 </p>
		<p>    在你升级到SQL Server 2005之后，你或许会有疑问：升级真的完成了吗？因为你会发现系统图标中的服务管理器不见了。SQL Server服务管理器已经被替换成了SQL Server配置管理器，可以通过“开始-&gt;程序-&gt;SQL Server 2005-&gt;管理工具-&gt;SQL Server配置管理器”，或者右键点击“我的电脑-&gt;管理”，然后打开服务与配置选项卡运行。 </p>
		<p>    9.企业管理器 </p>
		<p>    要找到新的管理器有一点麻烦，但你很快会发现在SQL Server 2005中，SQL Server企业管理器（SEM）已经被SQL Server管理中心 (SSMS)代替了。在对大量对象和服务器的管理中，SSMS的运行速度更快。一切操作都可以用脚本实现。而且多数对话框不是传统的对话框模式，你可以更好地同时应付多个任务。 </p>
		<p>    10.查询分析器 </p>
		<p>    对开发人员和数据库管理员来说最重要的查询分析器已经换成了查询编辑器。你可以在管理中心中选择新建查询来调用它。查询编辑器提供了编写和运行T-SQL查询语句的分析器基本功能，并可以与SourceSafe整合进行版本控制。然而，查询编辑器缺少调试T-SQL语句的功能。你需要使用Visual Studio 2005的数据库项目来进行调试。 </p>
		<p>    11.分析服务管理器 </p>
		<p>    在SQL Server 2005中，微软彻底改变了分析服务的管理和开发配置。以往的分析服务管理器被SSMS和商业智能开发中心(BIDS)所代替。分析服务的管理由SSMS处理，创建和部署立方体结构等开发任务由BIDS处理。 </p>
		<p>    12.DTS设计器 </p>
		<p>    在SQL Server 2005中，DTS被SQL Server整合服务(SSIS)所代替。在处理过程中，以往的DTS设计器被新的SSIS设计器所代替。SQL Server 2000中，DTS设计器是在企业管理器中启动。而SSIS设计器是在BIDS中启动。打开BIDS，选择“文件-&gt;新建-&gt;项目-&gt;商业智能项目-&gt;整合服务项目”以启动SSIS设计器。 </p>
		<p>    13.导入/导出向导 </p>
		<p>    菜单里没有了这个选项，但它并没有被删除，你可以在命令行模式下运行dtswizard.exe找到它（别被字面蒙骗，这个程序是使用SSIS的，不是DTS）。你也可以打开一个SSIS项目，右键点击SSIS包来启动导入/导出。 <br /><br />来源：CSDN<br /></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/75585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-10-17 13:18 <a href="http://www.blogjava.net/SIDNEY/archive/2006/10/17/75585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级到SQL Server 2005 的10大理由     选择自 wangchinaking 的 Blog </title><link>http://www.blogjava.net/SIDNEY/archive/2006/09/21/71004.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Thu, 21 Sep 2006 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/09/21/71004.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/71004.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/09/21/71004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/71004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/71004.html</trackback:ping><description><![CDATA[
		<p>前言<br /> <br />SQL Server 2000从上市到现在已经整整五个年头。现在望眼欲穿的SQL Server 2005 终于发布了。五年磨一剑，SQLServer 2005 将是微软具有里程碑性质的企业级数据库产品。本文从用户关心的技术要点出发比较和讨论SQL Server 2005 相对它的前版本SQL Server 2000所做的重大改进或新增功能，介绍了SQL Server 2005 中最值得你为之升级的10 个理由。无论你是想了解或学习SQL Server 2005，还是正在评估或考虑升级到SQL Server 2005，本文都将对您有很好的参考作用。<br /> <br />升级理由一：数据分区<br /> <br />    只有到了2005 版本SQL Server才拥有了真正的表和索引数据分区技术。这个技术一下子使SQL Server数据库从“青壮年”成长为成熟的企业级数据库产品，是一个里程碑性质的标志。数据分区技术极大加强了表的可伸缩性和可管理性，使得SQLServer 处理海量数据的能力有了质的飞跃，是我认为最值得升级的一个理由。<br /> <br />    数据库随着硬件和业务的发展变得越来越大。五年前大多数数据库还不过是十几个GB大小，很少超过TB级别的。现在几百个GB大小的数据库系统随处可见。如果没有数据分区技术而想对大数据库进行高效管理是很困难的。SQL Server 2005以前版本的一个问题是随着时间的推移数据库越来越大，备份需要的空间越来越多，如何处理数据库中的历史数据是很棘手的事情。有些客户可能会使用DELETE语句定期定量删除大表中的历史记录，如在每个周末备份数据库后删除一个星期以前的所有数据。但是如果表有上千万行十几个GB 大小，那么使用DELETE语句删除数据库中上万行或高达20%数据的话，其性能很差。如果是在7 × 24小时运行的联机系统做这样的数据维护操作那么还会引起比较严重的阻塞问题。另外有些客户针对这个问题直接在方案设计上下功夫，比如按照年份月份星期设计表，然后定期把一些过时的历史数据表（注意是“表”）备份并DROP掉，使得数据库大小以及系统性能都能保持相对稳定。但是这种方法有一个弊端，即应用程序必须做相应的配合根据不同的时间访问对应的表，增加了数据库管理以及数据库访问逻辑的复杂性。<br /> <br />    大表还容易带来性能问题。你也许会想到SQL Server 2000中的本地分区视图或分布式分区视图技术。是的，SQL Server2000 中的确已经有分区视图的概念，从SQL Server 7.0开始就有了。可惜分区视图的一个令人讨厌的地方是其管理、设计和开发比较困难，特别是分布式分区视图。如如何更新分布式视图就是个难题。所以尽管一个设计良好的分区视图系统会有很不错的性能改善，却因为繁琐的配置，管理和开发使得其没有在实际中得到充分应用。<br /> <br />    现在，SQL Server 2005 引入了真正的数据水平分区技术，上面讨论的数据库增长问题和性能问题就迎刃而解。这个进步绝对不是一小步。数据库的大小不再是个问题。你可以根据字段值的范围将表和索引划分为多个分区从而可以轻松管理一个几个TB大小的数据库系统。无论数据如何增长，你都可以使用分区技术使得数据库大小保持相对稳定。其中特别值得称赞的地方是SQL Server 2005 中分区的管理和使用非常简单。分区的删除，添加，拆分、合并和移动，以及分区的数据装载等管理都非常容易。你可以对单独的分区进行维护而不是整个表。如果你需要大量装载数据，那么你可以先把数据并行的装入到一个新分区当中，建立索引，然后把该分区合并到当前分区中来。这个动作需要的时间极短。如果你需要删除历史数据，假设你已经设计好了历史数据分区，那么你仅仅需要把该分区移除即可，几乎可以一瞬间完成。分区也使得大型表的并发访问性能得到改善，特别是有多个CPU的数据库系统。那些需要交叉访问大量数据的查询将从分区技术中获益不少。 <br /> </p>
		<p>升级理由二：可编程性</p>
		<p>CLR 集成</p>
		<p> </p>
		<p>SQL Server 2005的可编程性是值得升级的第二个重要理由。从来没有哪一个版本能像SQL Server 2005 这样带来这么多编程方面的变革。说老实话，在我知道的瞬间我是惊呆了。有些变化是革命性的。如CLR（Common Language Runtime,公共语言运行时）集成。就先说说CLR集成。CLR集成是指你可以使用任何一种.NET 语言编写SQL Server 2005 的存储过程，触发器，函数，自定义类型，甚至是自定义的聚合函数。估计不少数据库软件开发商会为这个功能欢呼雀跃。想想以前的扩展存储过程，编程非常不容易。代码中一不小心就会引起内存泄漏。而且由于扩展存储过程运行在SQL Server 的进程空间中，不好的代码容易引起访问违规（Access Violation）导致SQLServer 异常。</p>
		<p>
				<br />    现在有了CLR 集成，你可以轻松利用.NET语言的优势如其面向对象的封装、继承和多态特性，编写出那些需要对数据进行复杂数值计算或逻辑的代码，如字符串处理，数据加密算法，XML数据操作等等。由于CLR代码宿于SQL Server进程，你可以非常容易访问数据库中的数据。有了CLR，你不再局限于T-SQL，你现在立即拥有了.NET 框架类库提供的各种各样的类和例程，以及.NET语言提供的一致的编程模型，如错误处理。展现在你面前的是一个可以无限扩展的编程空间。你现在需要的仅仅是考虑什么时候使用T-SQL 语言，什么时候使用CLR。我猜测那些SQL Server软件开发商几乎会立即升级到SQLServer 2005 享受数据库编程的便捷。</p>
		<p> </p>
		<p>T-SQL 语言增强</p>
		<p> </p>
		<p>    SQL Server 2005 中的T-SQL语言有了非常大的改进。其中笔者最为称道的是现在可以使用和C++或C#类似的TRYCATCH结构对T-SQL 进行错误处理了，大大简化了T-SQL错误处理编程。SQL Server 2005以前的版本通过设置@@error变量表示最后的T-SQL 语句执行成功与否。为避免@@error变量被新执行的语句重置，你必须为每一条可能出错的TSQL语句后面立即检查或保存@@error变量的值，并使用相应的G O T O 语句进行跳转，使得代码变得复杂难读。现在SQLServer 2005 有了TRY-CATCH结构你只需要把相关的一组语句放在TRY块里面即可。如果TRY块里面任何语句发生错误，就会执行相应的CATCH 块。你甚至可以使用嵌套的TRYCATCH来实现复杂错误处理流程。估计很多T-SQL语言使用者可能就为了这个TRY-CATCH 结构而迫不及待地升级到SQL Server 2005。</p>
		<p>
				<br />    除了传统的DML（INSERT/UPDATE/DELETE）触发器，SQL Server 2005 现在也可以对DDL 语言（CREATE、ALTER或DROP 开头的语句）创建触发器了。这对于那些需要对DDL语言执行管理任务如审核以及规范数据库操作的用户特别有用。以前很多客户问我如何跟踪或避免表的删除操作，现在终于有了答案。你可以简单建立一个针对DROP 语句的触发器然后在触发器里面ROLLBACK 事务就可以回滚DROP 动作了。</p>
		<p>
				<br />    SQL Server 2005 T-SQL 中还有一个很酷的OUTPUT 子句。现在你不费吹灰之力就可以获得INSERT 、UPDATE 或DELETE语句所影响的每行的信息。对于在INSERT或UPDATE操作之后需要检索标识列或计算列的值的场合OUTPUT子句非常有用。如获得数据INSERT 后该行的Identity的值，产生一些唯一流水号，验证刚刚插入的数据等等。一个有趣的例子是Identity值的取得。在SQL Server 2000 中你可以在INSERT 语句后立即调用IDENT_CURRENT()或SCOPE_IDENTITY()函数来得到INSERT 语句的Identity。现在你仅仅需要在INSERT 语句中指定output子句就直接得到刚刚插入的Identity值，实在太简单了，不是吗？</p>
		<p>
				<br />    SQL Server 2005 中T-SQL 语言新增或加强的功能还有很多。如SQL Server 2005 新增加了一类排名函数RANK/DENSE_RANK/NTILE/ROW_NUMBER，轻松解决了开发者要求返回数据行中提供行号等排序功能。新增的P I V O T 和UNPIVOT运算符使得对结果集进行行和列的旋转变换十分简单。公用表表达式(CTE)解决了T-SQL语言的递归查询问题，而使用OPENROWSET 语句现在可以直接从文件里面执行大容量操作了。我觉得每一个改进都是那么有针对性，以至于使我相信这些T-SQL增强必定是SQL Server开发小组真正聆听数据库开发者心声的结果。</p>
		<p> </p>
		<p>升级理由三：安全</p>
		<p> </p>
		<p>    SQL Server 2005 的安全功能是我认为值得升级的第三个理由。SQL Server 2005 的安全达到了前所未有的强大水平，有着比以前版本更清晰的安全模型即主体，安全对象和权限。在SQLServer 2000 中是用服务器级权限、数据库角色和数据用户权限的混合方式管理权限。而SQL Server 2005 统一使用GRANT语句管理主体对安全对象的权限，简化了安全管理。其中我认为最大的改进是用户和架构（schema）分离。在SQL Server 2000中如果用户不是DBO 且拥有对象，那么移除该用户将是很麻烦的事情。你需要首先使用sp_changeobjectowner改变该用户拥有的对象所有权，然后把所有引用该对象的代码做相应的修改。而在SQL Server 2005 中就不需要这样麻烦了，因为现在用户不再拥有对象。拥有对象的是schema 而不是用户。数据库中的所有对象都属于某个schema。对象的完整名字是server.database.schema.object，符合SQL-99 标准，而不是以前的server.database.user.object 方式。删除用户仅需要改变schema的owner就可以了。不需要修改任何已存在的数据库访问代码，真的很方便。用户和架构分离还有一个好处就是对象的权限管理变得简单。你可以把某些对象集中于某个架构里面，然后对该架构设置权限，那么架构里面的所有对象就自动继承了同样的权限。</p>
		<p> </p>
		<p>    如果你需要保护数据库中的敏感数据，那么SQL Server2005 中的数据加密功能绝对值得考虑。以前不止一次有客户问我如何加密数据库中的某些数据，是否可以使用一些内部不公开的函数如PWDENCRYPT加密数据。我的回答是使用Windows的EFS（加密文件系统）功能加密数据库文件或在应用程序层对数据加密后再存储。现在用户期盼已久的数据加密功能终于在SQL Server 2005 中得到实现，那些有机密数据需要保护的用户值得高兴了。SQL Server 2005不是简单的提供一些加密函数，而是把市场上已经成熟的数据安全技术引进到数据库中，有一个清晰的加密层次结构。SQL Server 2005 支持证书（certificate），非对称密钥和对称密钥算法，一是防止敏感数据被泄漏，二是防止数据被篡改。对称密钥支持RC4，RC2，TripleDES 和AES算法，而非对称密钥使用RSA 算法。证书其实就是非对称密钥中公钥的容器。密钥管理是安全中比较弱的部分。SQL Server 2005 每一层都使用证书、非对称密钥和对称密钥的组合对它下面的一层进行加密，提高了密钥安全性。出于性能考虑，一般不用加密强度大的非对称密钥或证书直接加密数据，而是使用对称密钥加密数据获得较快的性能，然后使用证书或非对称密钥加密对称密钥。</p>
		<p> </p>
		<p>升级理由四：快照隔离</p>
		<p> </p>
		<p>    你还在为系统出现的阻塞（blocking）或死锁（deadlock）现象苦恼吗？快试试SQL Server 2005 中的快照隔离吧。通过行版本（row versioning）控制技术，SQL Server 2005 除了原来支持的四种事务隔离级别（脏读、提交读、可重复读、可串行读）外新增了一个快照（SNAPSHOT）隔离级别，有可能使阻塞或死锁成为历史。SQL Server在TEMPDB中存放不同版本的数据行，select 语句读取这些不同版本的行，读操作不阻塞写数据，写操作也不阻塞读操作，这样那些由于读/ 写争用导致的大量死锁的系统将从中获得无穷益处。如果你的系统复杂难优化，那么升级到SQL Server 2005 试试快照隔离级别，也许会有意想不到的效果。</p>
		<p> </p>
		<p>    SQL Server 2005中的快照隔离可细分为两种即READ_COMMITTED_SNAPSHOT和ALLOW_SNAPSHOT_ISOLATION。建议大家多使用前者，因为已提交读隔离可用于大多数现有应用程序，而不需要进行任何更改，其占用的TEMPDB空间也少。可以预见如果使用快照隔离级别，那么需要特别关注TEMPDB的大小和性能。你也许需要把TEMPDB放在有足够空间的单独磁盘上以提高性能。</p>
		<p> </p>
		<p>    考虑到快照隔离在避免阻塞和死锁方面的作用，我把它作为升级的第四个理由。</p>
		<p> </p>
		<p>升级理由五：数据库镜像</p>
		<p> </p>
		<p>    对于那些要求高可用性的用户来说，数据库镜像也许是考虑升级的唯一理由。SQL Server 2005的前版本在高可用性方面提供了故障转移群集（Failover Cluster）和Log shipping方案。群集方案的一个好处是在一台机器发生问题时它可以提供极快的故障转移能力，在备份服务器上联机数据库，应用程序只需重新连接即可。群集方案的一个缺点是数据库放在共享盘上，有单点失效这个缺点，一旦共享盘失败将导致整个系统崩溃。所以群集方案一般都要结合严紧的备份方案一起使用。而logshipping系统有一个时间上的延迟，且如果日志备份很大，传送速度也是个问题。SQL Server 2005引入的数据库镜像可作为故障转移群集或Log shipping 的替代或补充方案来提高数据库的高可用性。镜像的主要优点是它比前两者更容易管理，没有群集的单点失效缺点,也没有log shipping 的时间延迟。镜像服务器可以放在很远的地方，提高了作为备份服务器的高可用性。</p>
		<p>
				<br />    数据库镜像需要两台或三台服务器。主服务器通过传送事务日志中的每个事务到镜像服务器来进行数据同步。每当数据库commit一个事务，该事务就会被同步到镜像服务器。如果事务安全设置为FULL，传送操作将为同步操作。同步操作可以确保将提交的事务提交给两个服务器，但可能会增加事务提交的时间。如果事务安全设置为OFF，操作将为异步操作。事务会在不等待镜像服务器的情况下提交，这将不影响主服务器事务的提交时间，但不能确保镜像也提交了该事务，所以在出现故障那一刻有可能有部分日志丢失。对于需要严格同步数据的镜像系统可以采取同步模式。而仅仅希望有个备份服务器又不影响性能的情况下可以使用异步模式（高性能模式）。无论那种模式，一旦主服务器出现问题，你可以手动实现故障转移或配置系统实现自动故障转移。</p>
		<p> </p>
		<p>升级理由六：商务智能BI 增强</p>
		<p> </p>
		<p>    SQL Server 2005 对已经有或打算开发基于SQL Server 的商务智能方案的用户吸引力极大。SQL Server 2005中有关商务智能方面的增强很多，是升级的很好理由。首先是传统的DTS（Data Transformation Services）被新的IS（Integration Services）代替。SQL Server 2000 中的DTS用来在不同服务器之间转移数据，但对于复杂重复的工作流DTS倍感吃力。IS重新改写了DTS的数据流引擎，引入提取、转换和加载（ETL）数据的新编程体系，将数据流与控制流分开，开发能力大大加强，包部署、管理和性能方面也比DTS上了一个数量级。笔者看来，DTS终于从原来的小打小闹成长为成熟的IS 数据集成服务体系。</p>
		<p>
				<br />    分析服务（Analysis Services）在SQL Server 2005 中也有很多改进。原来没有profiler想跟踪分析服务里面的语句非常痛苦。现在2005 终于支持profiler了。Profiler对性能调优和排查错误将非常有用。分析服务2005 真正具备了实时分析能力，新增加了四种数据挖掘算法，也支持.NET语言进行开发（如存储过程等）。至于报表服务，2005 版本中添加了报表生成器和模型设计器这两个新工具，支持报表拖拉设计。2005 的报表改进如新的打印功能、多值参数等。设计过报表的人员会深深知道多值参数的妙处。</p>
		<p> </p>
		<p>    另外，无论是IS、报表服务等都可以在类似Visual Studio的环境中开发，任务完成不过鼠标拖拉之间，非常容易上手。</p>
		<p> </p>
		<p>升级理由七：全文搜索增强</p>
		<p> </p>
		<p>    相对前版本SQL Server 2005中性能提升最多的部分当数全文检索。SQL Server 2000 中的全文本检索和SQL Server 7.0中的差别不大，处于能用的水平。在SQL Server 2000中使用全文检索一个最大的痛苦是建立全文索引的性能不好，需要的时间太长，特别是在表很大的情况下。一个几千万行数据的表也许需要数个小时到数天时间才能完成全文索引的建立。SQL Server 2005全文检索在开发的时候就集中于三点：性能，集成，和可扩展性。据开发小组人员的简单测试，原来在SQL Server 2000中建立全文索引需要14天的表，现在只需要几个小时！几乎有上百倍的性能提升，只能用“惊异”来形容。其相关的全文检索语句也有30％～50％甚至更高的性能提高。性能方面的提高得益于全新设计的全文检索引擎。其中关键的一点设计是全文检索引擎现在使用共享内存和SQL Server 进行数据大规模并发交互，而不是原来基于逐行的方式，使得性能上了好几个数量级。</p>
		<p> </p>
		<p>    除了性能，SQL Server 2005 中的全文索引的集成性也大大加强。在SQL Server 2000 中很难对全文检索进行备份。一旦有数据库恢复或移动，你得重新重建索引。对于几百个GB的数据库，重建索引几乎是不能接受的恶梦。现在终于可以和数据库一起备份和恢复全文索引了。你不再需要在恢复数据库后重建全文索引了！恶梦终于成为历史。除了可以备份外，你也可以方便的改变全文索引的磁盘位置。你甚至可以在一个热备机器上把全文索引建立好，然后copy 这个索引到生产服务器上使用。</p>
		<p> </p>
		<p>升级理由八：可用性功能增强</p>
		<p> </p>
		<p>    索引联机操作。除了数据库镜像，SQL Server 2005 中可用性还有很多其他提高。索引现在可以使用ONLINE关键字进行在线建立或重建或删除了。它的技术要点是在内存里面动态生成索引的另一个副本从而不影响原来查询的进行。一旦索引副本完成操作即替代原来索引成为当前索引。我认为索引联机操作的意义是很大的，因为很多数据库系统都有定期调整或维护索引方面的需求。有了2005 你无需担心业务的正常运行而大胆的对索引进行维护或修改。</p>
		<p> </p>
		<p>    页校验和。SQL Server 2005中的数据库页引入校验和增强了数据的可靠性。除了原来SQL Server 2000 中已有的TORN_PAGE_DETECTION 外，SQL Server 2005 新增实现了页的检验和（CHECKSUM）。你使用ALTER DATABASE语句的SET PAGE_VERIFY子句即可指定。它的原理是向磁盘中写入8K数据页面时，SQL Server计算整个8K页面内容的校验和并将该值存储在页头中。再次从磁盘中读取页时，SQL Server动态计算读取到的页面内容的校验和，并与存储在页头中的校验和值进行比较。如果不相等则意味着页面有物理损坏，需要检查IO硬件。另外设置检验和的另一个好处是还可以在备份和还原操作过程中使用RESTORE VERIFYONLY语句验证每一数据页的完整性从而确认备份文件没有物理损坏。</p>
		<p> </p>
		<p>    在线还原。在数据库的某一部分未恢复前，用户无法对该部分进行访问，但可以访问所有其他数据。SQL Server 2000中如果数据库在还原或recovery当中，用户不能访问数据库。这样如果数据库很大需要rollback或rollforward的事务很多的话，recovery的时间会出奇的长。SQL Server 2005 的在线还原功能使得数据库在很短的时间内变得可用。</p>
		<p> </p>
		<p>升级理由九：复制增强</p>
		<p> </p>
		<p>    SQL Server 2000 中的复制功能已经很好。我这里把复制作为升级的一个理由因为SQL Server 2005在原来的基础上又增添了不少的功能。如peer-to-peer对等复制，可以在参与者之间相互进行复制，这样你可以采用对等复制在复制参与者之间建立某种程度的负载平衡。合并复制现在支持通过HTTPS进行数据同步，可以方便建立基于INTERNET 的复制。发布表现在可以使用标准的T-SQL语句如Alter Table等进行结构修改然后被复制而不是仅仅局限于使用sp_repladdcolumn和sp_repldropcolumn存储过程。在SQL Server 2000 中，仅支持向其他数据库（如DB2或Oracle）发布数据，而在SQL Server 2005 中，可将Oracle 数据库直接复制到SQL Server。可以从备份中初始化事务性订阅而不是仅仅局限于从快照对复制进行初始化，等等……</p>
		<p> </p>
		<p>升级理由十：异步处理能力</p>
		<p> </p>
		<p>    SQL Server 2005 通过引入全新的Service Broker 提供了革命性的异步处理能力。Service Broker提供了一个功能强大的异步编程模型。它为数据库应用程序增加了可靠、可扩展、分布式异步功能异步编程，允许程序仅仅在资源可用时才去执行占用大量资源的任务，以此来缩短响应时间，提高吞吐量。在我看来，Broker的最大好处一是异步执行能力，提高了可伸缩性，二是可靠执行，三是集成于数据库中，备份数据库就备份了broker 的消息队列。SQL Server 2005 中的查询通知就是基于Service Broker的应用。你可以使用查询通知功能来发送一个命令到SQL Server请求在查询结果发生变化时接收SQL Server的通知。这样就可以只有在程序以前检索的结果发生变化时，才需要重新查询数据库。一个可以预见的应用是在使用缓存的Web 站点中。Web站点首先发送语句到数据库服务器，获得数据，缓存到本地，然后只有在收到查询通知的时候才清理缓存，重新查询数据。这个机制避免了重复轮询SQL Server，大大减轻了服务器的负载，也提高了Web 站点的伸缩性。</p>
		<p> </p>
		<p>    因为SQL Server 2005 的Service Broker带来了数据库编程异步处理能力的革命，我把它作为升级的第十个理由。</p>
		<p> </p>
		<p>总结语</p>
		<p> </p>
		<p>    上面列出的十大理由仅仅是基于笔者的考虑，并没有囊括SQL Server 2005 所有的功能。SQL Server 2005 还有其他很多非常优秀或重大的改进。比如支持通过HTTP SOAP协议直接访问数据库，增加XML数据类型，支持Xquery，使用新的SQL ServerManagement Studio 等等。有一点我必须提一下，就是现在可以调用sp_create_plan_guide来强制指定SQL Server总是使用某个执行计划运行语句，避免SQL Server动态生成不够优化的查询计划，实在太棒了。在笔者看来，SQL Server 2005 带来的好处远远大于升级导致的工作量，升级到SQL Server 2005 是迟早的事情。早升级早拥有，对SQL Server 2005，你准备好了吗？</p>
		<p> </p>
		<p>作者Blog：<a href="http://blog.csdn.net/wangchinaking/">http://blog.csdn.net/wangchinaking/</a><br /></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/71004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-09-21 09:59 <a href="http://www.blogjava.net/SIDNEY/archive/2006/09/21/71004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sp_fulltext_catalog (Transact-SQL) </title><link>http://www.blogjava.net/SIDNEY/archive/2006/08/02/61306.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 02 Aug 2006 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/08/02/61306.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/61306.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/08/02/61306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/61306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/61306.html</trackback:ping><description><![CDATA[
		<h3 class="subHeading">A. 创建全文目录</h3>
		<div class="subSection">
				<p>此示例在 <b>AdventureWorks</b> 数据库中创建一个空的全文目录 <b>Cat_Desc</b>。</p>
				<div class="code" id="ctl00_LibFrame_ctl12_other">
						<div class="CodeSnippetTitleBar">
								<div class="CodeDisplayLanguage">
								</div>
						</div>
						<pre class="code" id="ctl00_LibFrame_ctl12other" space="preserve">USE AdventureWorks;
GO
EXEC sp_fulltext_catalog 'Cat_Desc', 'create';
GO</pre>
				</div>
		</div>
		<h3 class="subHeading">B. 重新生成全文目录</h3>
		<div class="subSection">
				<p>此示例在 <b>AdventureWorks</b> 数据库中重新生成现有的全文目录 <b>Cat_Desc</b>。</p>
				<div class="code" id="ctl00_LibFrame_ctl13_other">
						<div class="CodeSnippetTitleBar">
								<div class="CodeDisplayLanguage">
								</div>
						</div>
						<pre class="code" id="ctl00_LibFrame_ctl13other" space="preserve">USE AdventureWorks;
GO
EXEC sp_fulltext_catalog 'Cat_Desc', 'rebuild';
GO</pre>
				</div>
		</div>
		<h3 class="subHeading">C. 启动全文目录的填充</h3>
		<div class="subSection">
				<p>此示例将开始 <b>Cat_Desc</b> 目录的完全填充。</p>
				<div class="code" id="ctl00_LibFrame_ctl14_other">
						<div class="CodeSnippetTitleBar">
								<div class="CodeDisplayLanguage">
								</div>
						</div>
						<pre class="code" id="ctl00_LibFrame_ctl14other" space="preserve">USE AdventureWorks;
GO
EXEC sp_fulltext_catalog 'Cat_Desc', 'start_full';
GO</pre>
				</div>
		</div>
		<h3 class="subHeading">D. 停止全文目录的填充</h3>
		<div class="subSection">
				<p>此示例将停止 <b>Cat_Desc</b> 目录的填充。</p>
				<div class="code" id="ctl00_LibFrame_ctl15_other">
						<div class="CodeSnippetTitleBar">
								<div class="CodeDisplayLanguage">
								</div>
						</div>
						<pre class="code" id="ctl00_LibFrame_ctl15other" space="preserve">USE AdventureWorks;
GO
EXEC sp_fulltext_catalog 'Cat_Desc', 'stop';
GO</pre>
				</div>
		</div>
		<h3 class="subHeading">E. 删除全文目录</h3>
		<div class="subSection">
				<p>此示例将删除 <b>Cat_Desc</b> 目录。</p>
				<div class="code" id="ctl00_LibFrame_ctl16_other">
						<div class="CodeSnippetTitleBar">
								<div class="CodeDisplayLanguage">
								</div>
						</div>
						<pre class="code" id="ctl00_LibFrame_ctl16other" space="preserve">USE AdventureWorks;
GO
EXEC sp_fulltext_catalog 'Cat_Desc', 'drop';
GO<br /><br /><a href="http://msdn2.microsoft.com/zh-cn/library/ms189801.aspx">http://msdn2.microsoft.com/zh-cn/library/ms189801.aspx</a><br /><br /></pre>
				</div>
		</div>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/61306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-08-02 10:27 <a href="http://www.blogjava.net/SIDNEY/archive/2006/08/02/61306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>excel 数据库导入到 sqlserver </title><link>http://www.blogjava.net/SIDNEY/archive/2006/07/05/56827.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Wed, 05 Jul 2006 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/07/05/56827.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/56827.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/07/05/56827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/56827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/56827.html</trackback:ping><description><![CDATA[<span lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'">select</span> <font face="Courier New" size=2><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"><font color=gray><span style="COLOR: gray">*</span> </font><font color=blue><span style="COLOR: blue">from</span> </font><o:p></o:p></span></font>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font face="Courier New" color=blue size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'">OPENROWSET</span> </font><font face="Courier New" color=gray size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: 'Courier New'">(</span> </font><font face="Courier New" color=red size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'">'MICROSOFT.JET.OLEDB.4.0'<o:p></o:p></span> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font face="Courier New" color=gray size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: 'Courier New'">,</span> </font><font face="Courier New" color=red size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'">'Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\Documents and Settings\xiongh\</span> </font><font color=red size=2><span style="FONT-SIZE: 10pt; COLOR: red">桌面</span> </font><font face="Courier New" color=red size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'">\</span> </font><font color=red size=2><span style="FONT-SIZE: 10pt; COLOR: red">今日投资通信录</span> </font><font face="Courier New" color=red size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: 'Courier New'">.xls'</span> </font><font face="Courier New" color=gray size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: gray; FONT-FAMILY: 'Courier New'">,</span> </font><font face="Courier New" size=2><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'">[sheet1$]<font color=gray><span style="COLOR: gray">)<o:p></o:p></span></font></span> </font></p>
<p><font face=宋体 color=black size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black"><o:p>OR<br>&nbsp;<br>&nbsp;SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',<br>&nbsp;'Data Source=D:\ZJS.xls;Extended Properties=Excel 8.0')...[Sheet1$]<br><br></o:p></span></font></p>
<p><font face=宋体 color=black size=2><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black"><a title=http://support.microsoft.com/kb/321686/zh-cn href="http://support.microsoft.com/kb/321686/zh-cn">http://support.microsoft.com/kb/321686/zh-cn</a> <o:p></o:p></span></font></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/56827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-07-05 17:18 <a href="http://www.blogjava.net/SIDNEY/archive/2006/07/05/56827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>join 使用详解方式 </title><link>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38923.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 03 Apr 2006 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38923.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/38923.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/38923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/38923.html</trackback:ping><description><![CDATA[
		<p>  join 方式<br />（1) cross join <br />      参与select语句所有表的的所有行的笛卡尔乘积<br />      select au_lname ,title<br />      from authors cross join  titiles </p>
		<p>     outer  join 对参与join的两个表有主从之分，处理方式以主表的每条数据去match 从属表的列，合乎条件的数据是我们所要的答案，不合乎条件的也是我们要的答案，只不过哪些从属表选取的列将被添上null。<br />(2) left join <br />     左边的为主表，右边为从属表<br />     select a.cust_id ,b.order_date,b.tot_ant<br />     from customer a left join sales b<br />     on (a.cust_id =b.cust_id and b.order_date&gt;''1996/10/15'')<br />     可以写为<br />     select a.cust_id,b.order_date,b.tot_ant<br />     from custom a <br />     left join (select * from sales where order_date&gt;''1996/10/15'') b<br />    on a.cust_id =b.cust_id   <br />(3) right join<br />     左边的表为从属表，右边的表为主表<br />(4) self join <br />     self join 常用在同一表内不同数据间对同一列的比较<br />    select a.emp_no,a.emp_name,b.emp_no,b.emp_name,a.date_hired<br />    from employee a<br />    join employee b<br />    on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)<br />    order by a.date_hired<br />   这样会重复数据，只要加上一句 and a.emp_name&gt;b.emp_name<br />(5) full join <br />     不仅列出符合条件的数据，两边未符合join条件的数据也会一并列出。哪些未符合join条件的数据如果在select列中无法得到对应的值则填上null<br />    select a.cust_id,b.tot_amt<br />    from customer a full join sales b<br />    on a.cust_id=b.cust_id<br />有表<br /> id   ic  name  amount<br />      I    *        *<br />      c<br />      i <br />      c <br />      i<br />      i   <br />   要求结果为  <br />    ic  name  amount  ic   name  amount<br />    i                         c <br />    i                         c<br />    i<br />    i<br />  select aaa.*,bbb.*<br />  from ( select (select count(id) from  aa as  b where (b.id&lt;a.id) and (ic=''i'')) as     newid, * from aa a where ic=''i'') aaa<br />  full join <br />   (select (select count(id) from aa as b where b.id&lt;a.id and ic=''c'') as newid,* from<br /> aa a where ic=''c'') bbb<br />on aaa.newid=bbb.newid<br />order by aaa.name<br />6.使用 HASH 和 MERGE 联接提示<br />此示例在 authors、titleauthors 和 titles 表之间建立三表联接，以生成一个作者及其著作的列表。查询优化器使用 MERGE 联接将 authors 和 titleauthors (A x TA) 联接在一起。然后，将 authors 和 titleauthors MERGE 联接 (A x TA) 的结果与 titles 表进行 HASH 联结以生成 (A x TA) x T。</p>
		<p>
				<br />重要  指定联接提示后，要执行 INNER JOIN 时 INNER 关键字不再为可选，而必须显式说明。</p>
		<p>
				<br />USE pubs<br />SELECT SUBSTRING((RTRIM(a.au_fname) + '' '' + LTRIM(a.au_lname)), 1, 25)<br />   AS Name, SUBSTRING(t.title, 1, 20) AS Title<br />FROM authors a INNER MERGE JOIN titleauthor ta <br />   ON a.au_id = ta.au_id INNER HASH JOIN titles t <br />   ON t.title_id = ta.title_id<br />ORDER BY au_lname ASC, au_fname ASC</p>
		<p>下面是结果集：</p>
		<p>Warning: The join order has been enforced because a local join hint is used.<br />Name                      Title                <br />------------------------- -------------------- <br />Abraham Bennet            The Busy Executive''s <br />Reginald Blotchet-Halls   Fifty Years in Bucki <br />Cheryl Carson             But Is It User Frien <br />Michel DeFrance           The Gourmet Microwav <br />Innes del Castillo        Silicon Valley Gastr <br />...                    ...<br />Johnson White             Prolonged Data Depri <br />Akiko Yokomoto            Sushi, Anyone?       </p>
		<p>(25 row(s) affected)</p>
		<h3>
				<a name="_inner_join">
				</a>(7)Inner Join</h3>
		<p>Inner Join 逻辑运算符返回满足第一个（顶端）输入与第二个（底端）输入联接的每一行。</p>
		<p>作者Blog：<a href="http://blog.csdn.net/softj/">http://blog.csdn.net/softj/</a></p>
<img src ="http://www.blogjava.net/SIDNEY/aggbug/38923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-04-03 13:54 <a href="http://www.blogjava.net/SIDNEY/archive/2006/04/03/38923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OLAP</title><link>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38842.html</link><dc:creator>渠上月</dc:creator><author>渠上月</author><pubDate>Mon, 03 Apr 2006 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38842.html</guid><wfw:comment>http://www.blogjava.net/SIDNEY/comments/38842.html</wfw:comment><comments>http://www.blogjava.net/SIDNEY/archive/2006/04/03/38842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SIDNEY/comments/commentRss/38842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SIDNEY/services/trackbacks/38842.html</trackback:ping><description><![CDATA[
		<center> </center>
		<br />(转载自北大高科网站，http://www.pku-ht.com/) <br /><br />联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的，他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响，OLAP作为一类产品同联机事务处理 (OLTP) 明显区分开来。<br /><br />    当今的数据处理大致可以分成两大类：联机事务处理OLTP（on-line transaction processing）、联机分析处理OLAP（On-Line Analytical Processing）。OLTP是传统的关系型数据库的主要应用，主要是基本的、日常的事务处理，例如银行交易。OLAP是数据仓库系统的主要应用，支持复杂的分析操作，侧重决策支持，并且提供直观易懂的查询结果。下表列出了OLTP与OLAP之间的比较。<br /><br /><p></p><table align="center"><tbody><tr><td valign="top" height="130"><table width="97%" border="1"><tbody><tr><td class="p1" width="22%"><div align="center"></div></td><td class="p1" width="41%"><div align="center">OLTP</div></td><td class="p1" width="37%"><div align="center">OLAP</div></td></tr><tr><td class="p1" width="22%"><div align="center">用户</div></td><td class="p1" width="41%"><div align="center">操作人员,低层管理人员</div></td><td class="p1" width="37%"><div align="center">决策人员,高级管理人员</div></td></tr><tr><td class="p1" width="22%"><div align="center">功能</div></td><td class="p1" width="41%"><div align="center">日常操作处理</div></td><td class="p1" width="37%"><div align="center">分析决策</div></td></tr><tr><td class="p1" width="22%"><div align="center">DB 设计</div></td><td class="p1" width="41%"><div align="center">面向应用</div></td><td class="p1" width="37%"><div align="center">面向主题</div></td></tr><tr><td class="p1" width="22%"><div align="center">数据</div></td><td class="p1" width="41%"><div align="center">当前的, 最新的细节的, 二维的分立的</div></td><td class="p1" width="37%"><div align="center">历史的, 聚集的, 多维的集成的, 统一的</div></td></tr><tr><td class="p1" width="22%"><div align="center">存取</div></td><td class="p1" width="41%"><div align="center">读/写数十条记录</div></td><td class="p1" width="37%"><div align="center">读上百万条记录</div></td></tr><tr><td class="p1" width="22%"><div align="center">工作单位</div></td><td class="p1" width="41%"><div align="center">简单的事务</div></td><td class="p1" width="37%"><div align="center">复杂的查询</div></td></tr><tr><td class="p1" width="22%"><div align="center">用户数</div></td><td class="p1" width="41%"><div align="center">上千个</div></td><td class="p1" width="37%"><div align="center">上百个</div></td></tr><tr><td class="p1" width="22%"><div align="center">DB 大小</div></td><td class="p1" width="41%"><div align="center">100MB-GB</div></td><td class="p1" width="37%"><div align="center">100GB-TB</div></td></tr></tbody></table></td></tr></tbody></table><td></td><tr><td height="756"></td><td valign="top" colspan="3"><table cellspacing="0" cellpadding="0" width="760" align="center" border="0"><tbody><tr><td width="100%" height="133"><span class="b1">    <br />     OLAP是使分析人员、管理人员或执行人员能够从多角度对信息进行快速、一致、交互地存取,从而获得对数据的更深入了解的一类软件技术。OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表需求,它的技术核心是"维"这个概念。<br /><br />    “维”是人们观察客观世界的角度,是一种高层次的类型划分。“维”一般包含着层次关系,这种层次关系有时会相当复杂。通过把一个实体的多项重要的属性定义为多个维(dimension)，使用户能对不同维上的数据进行比较。因此OLAP也可以说是多维数据分析工具的集合。<br /><br />    OLAP的基本多维分析操作有钻取（roll up和drill down）、切片（slice）和切块（dice）、以及旋转（pivot）、drill across、drill through等。<br /><br />·钻取是改变维的层次，变换分析的粒度。它包括向上钻取（roll up）和向下钻取（drill down）。roll up是在某一维上将低层次的细节数据概括到高层次的汇总数据，或者减少维数；而drill down则相反，它从汇总数据深入到细节数据进行观察或增加新维。<br />·切片和切块是在一部分维上选定值后，关心度量数据在剩余维上的分布。如果剩余的维只有两个，则是切片；如果有三个，则是切块。<br />·旋转是变换维的方向，即在表格中重新安排维的放置（例如行列互换）。 </span><p><span class="b1">    OLAP有多种实现方法，根据存储数据的方式不同可以分为ROLAP、MOLAP、HOLAP。<br /><br />    ROLAP表示基于关系数据库的OLAP实现（Relational OLAP）。以关系数据库为核心,以关系型结构进行多维数据的表示和存储。ROLAP将多维数据库的多维结构划分为两类表:一类是事实表,用来存储数据和维关键字;另一类是维表,即对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息。维表和事实表通过主关键字和外关键字联系在一起,形成了"星型模式"。对于层次复杂的维,为避免冗余数据占用过大的存储空间,可以使用多个表来描述,这种星型模式的扩展称为"雪花模式"。<br /><br />    MOLAP表示基于多维数据组织的OLAP实现（Multidimensional OLAP）。以多维数据组织方式为核心,也就是说,MOLAP使用多维数组存储数据。多维数据在存储中将形成"立方块（Cube）"的结构,在MOLAP中对"立方块"的"旋转"、"切块"、"切片"是产生多维数据报表的主要技术。<br /><br />    HOLAP表示基于混合数据组织的OLAP实现（Hybrid OLAP）。如低层是关系型的，高层是多维矩阵型的。这种方式具有更好的灵活性。<br /><br />还有其他的一些实现OLAP的方法，如提供一个专用的SQL Server，对某些存储模式（如星型、雪片型）提供对SQL查询的特殊支持。<br /><br />    OLAP工具是针对特定问题的联机数据访问与分析。它通过多维的方式对数据进行分析、查询和报表。维是人们观察数据的特定角度。例如，一个企业在考虑产品的销售情况时，通常从时间、地区和产品的不同角度来深入观察产品的销售情况。这里的时间、地区和产品就是维。而这些维的不同组合和所考察的度量指标构成的多维数组则是OLAP分析的基础，可形式化表示为（维1，维2，……，维n，度量指标），如（地区、时间、产品、销售额）。多维分析是指对以多维形式组织起来的数据采取切片（Slice）、切块（Dice）、钻取（Drill-down和Roll-up）、旋转（Pivot）等各种分析动作，以求剖析数据，使用户能从多个角度、多侧面地观察数据库中的数据，从而深入理解包含在数据中的信息。<br /><br />    根据综合性数据的组织方式的不同，目前常见的OLAP主要有基于多维数据库的MOLAP及基于关系数据库的ROLAP两种。MOLAP是以多维的方式组织和存储数据，ROLAP则利用现有的关系数据库技术来模拟多维数据。在数据仓库应用中，OLAP应用一般是数据仓库应用的前端工具，同时OLAP工具还可以同数据挖掘工具、统计分析工具配合使用，增强决策分析功能。</span><br /><br /></p></td></tr></tbody></table></td></tr><img src ="http://www.blogjava.net/SIDNEY/aggbug/38842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SIDNEY/" target="_blank">渠上月</a> 2006-04-03 10:39 <a href="http://www.blogjava.net/SIDNEY/archive/2006/04/03/38842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>