﻿<?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>IT博客-红叶的技术日志-随笔分类-数据库</title><link>http://www.cnitblog.com/applezk/category/2760.html</link><description>希望每天能努力多一点</description><language>zh-cn</language><lastBuildDate>Wed, 05 Oct 2011 04:24:21 GMT</lastBuildDate><pubDate>Wed, 05 Oct 2011 04:24:21 GMT</pubDate><ttl>60</ttl><item><title>内连接，外连接，交叉连接</title><link>http://www.cnitblog.com/applezk/archive/2008/02/19/39904.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 19 Feb 2008 01:21:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2008/02/19/39904.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/39904.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2008/02/19/39904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/39904.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/39904.html</trackback:ping><description><![CDATA[探究内连接，外连接，交叉连接 <br>(一)内连接内连接查询操作列出与连接条件匹配的数据行，它使用比较运算符比较被连接列的列值。<br>内连接分三种：<br>1、等值连接：在连接条件中使用等于号(=)运算符比较被连接列的列值，其查询结果中列出被连接表中的所有列，包括其中的重复列。<br>使用等值连接，，在选择列表中列出LandTbl和TownTbl表中重复列(TownCode)：<br>例：Select * from LandTbl as A inner join TownTbl as B on A.TownCode=B.TownCode<br>2、不等连接：在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。<br>这些运算符包括&gt;、&gt;=、&lt;=、&lt;、!&gt;、!&lt;和&lt;&gt;。 <br>例：Select * from LandTbl as A inner join TownTbl as B on A.TownCode&lt;&gt;B.TownCode<br>3、自然连接：在连接条件中使用等于(=)运算符比较被连接列的列值，但它使用选择列表指出查询结果集合中所包括的列，并删除连接表中的重复列。<br>使用自然连接，在选择列表中删除LandTbl和TownTbl表中重复列(TownCode)：<br>Select A.*, B.CityCode, B.TownName from LandTbl as A inner join TownTbl as B on A.TownCode=B.TownCode
<p>(二)外连接内连接时，返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时，它返回到查询结果集合中的不仅包含符合连接条件的行，而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。<br>左外连接，显示符全条件的数据行及左边数据表中不符合条件的数据行 <br>例：<br>Select A.*, B.CityCode, B.TownName from LandTbl as A left (OUTER) join TownTbl as B on A.TownCode=B.TownCode<br>右外连接，显示符全条件的数据行及右边数据表中不符合条件的数据行 <br>例：<br>Select A.*, B.CityCode, B.TownName from LandTbl as A right (OUTER) join TownTbl as B on A.TownCode=B.TownCode<br>全外连接，显示符全条件的数据行及左边和右边数据表中不符合条件的数据行 <br>例：<br>Select A.*, B.CityCode, B.TownName from LandTbl as A full (OUTER) join TownTbl as B on A.TownCode=B.TownCode<br>(三)交叉连接交叉连接不带WHERE 子句，它返回被连接的两个表所有数据行的笛卡尔积，返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。<br>select A.*, B.CityCode, B.TownName from LandTbl cross join TownTbl</p>
<p>&nbsp;(-^_^-)</p>
<p><br>&nbsp;附（供參考）： </p>
<p>表TownTbl <br>栏位名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文描述&nbsp;&nbsp;&nbsp; <br>CityCode&nbsp;&nbsp;&nbsp;&nbsp; 县市代码&nbsp;&nbsp;&nbsp; <br>TownCode&nbsp;&nbsp; 乡镇代码&nbsp;&nbsp;&nbsp; <br>TownName&nbsp; 乡镇名称&nbsp;&nbsp;&nbsp; <br>&nbsp;<br>表LandTbl<br>栏位名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文描述&nbsp;&nbsp;&nbsp; <br>LandCode&nbsp;&nbsp;&nbsp;土地代号&nbsp;&nbsp;&nbsp; <br>LandName&nbsp; 土地名称&nbsp;&nbsp;&nbsp; <br>LandQty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 土地面积&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>TownCode&nbsp; 乡镇代码&nbsp;&nbsp;&nbsp; <br>Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 土地类别<br></p>
<img src ="http://www.cnitblog.com/applezk/aggbug/39904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2008-02-19 09:21 <a href="http://www.cnitblog.com/applezk/archive/2008/02/19/39904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为数据库建立索引</title><link>http://www.cnitblog.com/applezk/archive/2007/11/20/36541.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 20 Nov 2007 06:07:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2007/11/20/36541.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/36541.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2007/11/20/36541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/36541.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/36541.html</trackback:ping><description><![CDATA[前些时候，一位颇高级的程序员居然问我什么叫做索引，令我感到十分的惊奇，我想这绝不会是沧海一粟，因为有成千上万的开发者（可能大部分是使用MySQL的）都没有受过有关数据库的正规培训，尽管他们都为客户做过一些开发，但却对如何为数据库建立适当的索引所知较少，因此我起了写一篇相关文章的念头。<br><br>　　最普通的情况，是为出现在where子句的字段建一个索引。为方便讲述，我们先建立一个如下的表。<br><br>　　CREATE TABLE mytable (<br>　　　　　id serial primary key,<br>　　　　　category_id int not null default 0,<br>　　　　　user_id int not null default 0,<br>　　　　　adddate int not null default 0<br>　　);<br><br>　　很简单吧，不过对于要说明这个问题，已经足够了。如果你在查询时常用类似以下的语句：<br><br>　　　SELECT * FROM mytable WHERE category_id=1; <br><br>　　最直接的应对之道，是为category_id建立一个简单的索引：<br><br>　　　CREATE INDEX mytable_categoryid <br>　　　　　ON mytable (category_id);<br><br>　　OK，搞定？先别高兴，如果你有不止一个选择条件呢？例如：<br><br>　　　SELECT * FROM mytable WHERE category_id=1 AND user_id=2;<br><br>　　你的第一反应可能是，再给user_id建立一个索引。不好，这不是一个最佳的方法。你可以建立多重的索引。<br><br>　　CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);<br><br>　　注意到我在命名时的习惯了吗？我使用"表名_字段1名_字段2名"的方式。你很快就会知道我为什么这样做了。<br><br>　　现在你已经为适当的字段建立了索引，不过，还是有点不放心吧，你可能会问，数据库会真正用到这些索引吗？测试一下就OK，对于大多数的数据库来说，这是很容易的，只要使用EXPLAIN命令：<br><br>　　EXPLAIN<br><br>　　　SELECT * FROM mytable <br>　　　　WHERE category_id=1 AND user_id=2;<br><br>　　　This is what Postgres 7.1 returns (exactly as I expected) <br><br>　　　NOTICE: QUERY PLAN:<br><br>　　　Index Scan using mytable_categoryid_userid on <br>　　　　　mytable (cost=0.00..2.02 rows=1 width=16)<br><br>　　EXPLAIN<br><br>以上是postgres的数据，可以看到该数据库在查询的时候使用了一个索引（一个好开始），而且它使用的是我创建的第二个索引。看到我上面命名的好处了吧，你马上知道它使用适当的索引了。 <br><br><br>
<div class=NewsContent id=NewsContentLabel>接着，来个稍微复杂一点的，如果有个ORDER BY字句呢？不管你信不信，大多数的数据库在使用order by的时候，都将会从索引中受益。<br><br>　　　SELECT * FROM mytable <br>　　　　WHERE category_id=1 AND user_id=2<br>　　　　　ORDER BY adddate DESC;<br><br>有点迷惑了吧？很简单，就象为where字句中的字段建立一个索引一样，也为ORDER BY的字句中的字段建立一个索引：<br><br>　　　CREATE INDEX mytable_categoryid_userid_adddate<br>　　　　　ON mytable (category_id,user_id,adddate);<br><br>　　　注意: "mytable_categoryid_userid_adddate" 将会被截短为<br><br>　　 "mytable_categoryid_userid_addda"<br><br>　　　CREATE<br><br>　　　EXPLAIN SELECT * FROM mytable<br>　　　　WHERE category_id=1 AND user_id=2<br>　　　　　ORDER BY adddate DESC;<br><br>　　　NOTICE: QUERY PLAN:<br><br>　　　Sort (cost=2.03..2.03 rows=1 width=16)<br>　　　　-&gt; Index Scan using mytable_categoryid_userid_addda <br>　　　　　　　on mytable (cost=0.00..2.02 rows=1 width=16)<br><br>　　　EXPLAIN<br><br>　　看看EXPLAIN的输出，好象有点恐怖啊，数据库多做了一个我们没有要求的排序，这下知道性能如何受损了吧，看来我们对于数据库的自身运作是有点过于乐观了，那么，给数据库多一点提示吧。<br><br>　　为了跳过排序这一步，我们并不需要其它另外的索引，只要将查询语句稍微改一下。这里用的是postgres，我们将给该数据库一个额外的提示--在ORDER BY语句中，加入where语句中的字段。这只是一个技术上的处理，并不是必须的，因为实际上在另外两个字段上，并不会有任何的排序操作，不过如果加入，postgres将会知道哪些是它应该做的。<br><br>　　　EXPLAIN SELECT * FROM mytable <br>　　　　WHERE category_id=1 AND user_id=2<br>　　　　　ORDER BY category_id DESC,user_id DESC,adddate DESC;<br><br>　　　NOTICE: QUERY PLAN:<br><br>　　　Index Scan Backward using <br>　　　　mytable_categoryid_userid_addda on mytable <br>　　　　　(cost=0.00..2.02 rows=1 width=16)<br><br>　　　EXPLAIN<br><br>现在使用我们料想的索引了，而且它还挺聪明，知道可以从索引后面开始读，从而避免了任何的排序。<br><br>以上说得细了一点，不过如果你的数据库非常巨大，并且每日的页面请求达上百万算，我想你会获益良多的。不过，如果你要做更为复杂的查询呢，例如将多张表结合起来查询，特别是where限制字句中的字段是来自不止一个表格时，应该怎样处理呢？我通常都尽量避免这种做法，因为这样数据库要将各个表中的东西都结合起来，然后再排除那些不合适的行，搞不好开销会很大。<br><br>　　如果不能避免，你应该查看每张要结合起来的表，并且使用以上的策略来建立索引，然后再用EXPLAIN命令验证一下是否使用了你料想中的索引。如果是的话，就OK。不是的话，你可能要建立临时的表来将他们结合在一起，并且使用适当的索引。<br><br>　　要注意的是，建立太多的索引将会影响更新和插入的速度，因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格，就没有必要为一个很少使用的where字句单独建立索引了，对于比较小的表，排序的开销不会很大，也没有必要建立另外的索引。<br><br>　　以上介绍的只是一些十分基本的东西，其实里面的学问也不少，单凭EXPLAIN我们是不能判定该方法是否就是最优化的，每个数据库都有自己的一些优化器，虽然可能还不太完善，但是它们都会在查询时对比过哪种方式较快，在某些情况下，建立索引的话也未必会快，例如索引放在一个不连续的存储空间时，这会增加读磁盘的负担，因此，哪个是最优，应该通过实际的使用环境来检验。<br><br>　　在刚开始的时候，如果表不大，没有必要作索引，我的意见是在需要的时候才作索引，也可用一些命令来优化表，例如MySQL可用"OPTIMIZE TABLE"。<br><br>　　综上所述，在如何为数据库建立恰当的索引方面，你应该有一些基本的概念了。<br><br><br>
<p style="COLOR: #800000">一、索引的概念
<p style="COLOR: #800000">索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中，索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中，索引也允许数据库程序迅速地找到表中的数据，而不必扫描整个数据库。
<p style="COLOR: #800000">二、索引的特点
<p style="COLOR: #800000">1.索引可以加快数据库的检索速度
<p style="COLOR: #800000">2.索引降低了数据库插入、修改、删除等维护任务的速度
<p style="COLOR: #800000">3.索引创建在表上，不能创建在视图上
<p style="COLOR: #800000">4.索引既可以直接创建，也可以间接创建
<p style="COLOR: #800000">5.可以在优化隐藏中，使用索引
<p style="COLOR: #800000">6.使用查询处理器执行SQL语句，在一个表上，一次只能使用一个索引
<p style="COLOR: #800000">7.其他
<p style="COLOR: #800000">三、索引的优点
<p style="COLOR: #800000">1.创建唯一性索引，保证数据库表中每一行数据的唯一性
<p style="COLOR: #800000">2.大大加快数据的检索速度，这也是创建索引的最主要的原因
<p style="COLOR: #800000">3.加速表和表之间的连接，特别是在实现数据的参考完整性方面特别有意义。
<p style="COLOR: #800000">4.在使用分组和排序子句进行数据检索时，同样可以显著减少查询中分组和排序的时间。
<p style="COLOR: #800000">5.通过使用索引，可以在查询的过程中使用优化隐藏器，提高系统的性能。
<p style="COLOR: #800000">四、索引的缺点
<p style="COLOR: #800000">1.创建索引和维护索引要耗费时间，这种时间随着数据量的增加而增加
<p style="COLOR: #800000">2.索引需要占物理空间，除了数据表占数据空间之外，每一个索引还要占一定的物理空间，如果要建立聚簇索引，那么需要的空间就会更大
<p style="COLOR: #800000">3.当对表中的数据进行增加、删除和修改的时候，索引也要动态的维护，降低了数据的维护速度
<p style="COLOR: #800000">五、索引分类
<p style="COLOR: #800000">1.直接创建索引和间接创建索引
<p style="COLOR: #800000">直接创建索引： CREATE INDEX mycolumn_index ON mytable (myclumn)
<p style="COLOR: #800000">间接创建索引：定义主键约束或者唯一性键约束，可以间接创建索引
<p style="COLOR: #800000">2.普通索引和唯一性索引
<p style="COLOR: #800000">普通索引：
<p style="COLOR: #800000">CREATE INDEX mycolumn_index ON mytable (myclumn)
<p style="COLOR: #800000">唯一性索引：保证在索引列中的全部数据是唯一的，对聚簇索引和非聚簇索引都可以使用
<p style="COLOR: #800000">
<center>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td style="COLOR: #800000" bgColor=#e6e6e6>
            <pre>CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)</pre>
            </td>
        </tr>
    </tbody>
</table>
</center>
<p style="COLOR: #800000">
<p style="COLOR: #800000">
<p>&nbsp;</p>
<br></div>
<img src ="http://www.cnitblog.com/applezk/aggbug/36541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2007-11-20 14:07 <a href="http://www.cnitblog.com/applezk/archive/2007/11/20/36541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PCCC的几个备份文档</title><link>http://www.cnitblog.com/applezk/archive/2007/01/16/21952.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 16 Jan 2007 14:46:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2007/01/16/21952.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/21952.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2007/01/16/21952.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/21952.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/21952.html</trackback:ping><description><![CDATA[
		<p>
				<strong>ccafbackup.bat<br /></strong>@echo off</p>
		<p>rem date format is "YYYY-MM-DD"<br />rem 格式化日期</p>
		<p>set dt=%date:~0,10%</p>
		<p>set dy=%dt:~0,4%<br />set dm=%dt:~5,2%<br />set dd=%dt:~8,2%</p>
		<p>set dt=%dy%%dm%%dd%</p>
		<p>mkdir k:\DAILYBACKUP\%dt%</p>
		<p>isql -Usa -Psa -i d:\ccaf_backup.sql<br />move k:\CEFileStore.bak k:\DAILYBACKUP\%dt%\CEFileStore%dt%<br />move k:\CEFileStorelog.bak k:\DAILYBACKUP\%dt%\CEFileStore%dt%log<br />move k:\UAPSDB.bak k:\DAILYBACKUP\%dt%\UAPSDB%dt%<br />move k:\UAPSDBlog.bak k:\DAILYBACKUP\%dt%\UAPSDB%dt%log<br />move k:\VWdb.bak k:\DAILYBACKUP\%dt%\VWdb%dt%<br />move k:\VWdblog.bak k:\DAILYBACKUP\%dt%\VWdb%dt%log<br />move k:\master.bak k:\DAILYBACKUP\%dt%\master%dt%</p>
		<p>
				<strong>ccaf_backup.sql<br /></strong>backup database CEFileStore to disk='k:\CEFileStore.bak' with name='CEFileStore 备份'<br />backup log CEFileStore to disk='k:\CEFileStorelog.bak' with name='CEFileStore 备份'<br />backup database UAPSDB to disk='k:\UAPSDB.bak' with name='UAPSDB 备份'<br />backup log UAPSDB to disk='k:\UAPSDBlog.bak' with name='UAPSDB 备份'<br />backup database VWdb to disk='k:\VWdb.bak' with name='VWdb 备份'<br />backup log VWdb to disk='k:\VWdblog.bak' with name='VWdb 备份'<br />backup database master to disk='k:\master.bak' with name='master 备份'<br /><br /><strong>P8文件备份.bat<br /></strong>@echo off<br />REM last updated 10:00pm May 21,2001<br />cd d:\DAILYBACKUP<br />time /t &gt;d:\DAILYBACKUP\x.tmp<br />for /f "tokens=1" %%a in (d:\DAILYBACKUP\x.tmp) do set t1=%%a<br />date /t &gt;d:\DAILYBACKUP\x.tmp<br />for /f "tokens=1" %%a in (d:\DAILYBACKUP\x.tmp) do set d=%%a<br />rem for /f "tokens=2" %%a in (d:\DAILYBACKUP\x.tmp) do set d=%%a</p>
		<p>echo ******************************************************************* &gt;c:\p8%d%_backup.log<br />echo *              P8 文件系统每日备份 ON %d%            * &gt;&gt;c:\p8%d%_backup.log<br />echo ******************************************************************* &gt;&gt;c:\p8%d%_backup.log<br />echo 看完LOG文件后请退出Notepad. 谢谢. &gt;&gt;c:\p8%d%_backup.log<br />echo ******************************************************************* <br />echo *              P8 文件系统每日备份 ON %d%            *<br />echo ******************************************************************* <br />echo.<br />echo. &gt;&gt;c:\P8%d%_backup.log<br />echo.<br />echo.<br />echo. &gt;&gt;c:\P8%d%_backup.log</p>
		<p>ntbackup backup u:\ v:\ w:\ x:\ Z:\data Z:\fax Z:\pbc Z:\report Z:\scan /a  /d "Daily normal backup" /v:no /r:no /rs:no /hc:off /m normal /l:s /f "D:\DAILYBACKUP\%d%\Backup%d%.bkf"</p>
		<p>echo -----------------------------------------------------<br />echo -----------------------------------------------------&gt;&gt;c:\p8%d%_backup.log<br /><br /><br /><br /><br /><br /><br /><br /><br /></p>
<img src ="http://www.cnitblog.com/applezk/aggbug/21952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2007-01-16 22:46 <a href="http://www.cnitblog.com/applezk/archive/2007/01/16/21952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLserver中的isql命令的参数详解</title><link>http://www.cnitblog.com/applezk/archive/2007/01/16/21947.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 16 Jan 2007 13:48:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2007/01/16/21947.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/21947.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2007/01/16/21947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/21947.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/21947.html</trackback:ping><description><![CDATA[一、你是用Windows 帐号登录到本机的MS sql server,请用 isql -E<br />假设windows 帐号 ntuser1 要登录本机MS sql server,要这样做。<br /> 1、以NT帐号ntuser1登陆到Windows2000 professional,不是 MS SQL Server。<br /> 2、isql -S Server -E<br /><div><br />二、Sql Server 帐号这样做:<br />1、将身份验证设为SQL Server 和 Windows。<br />2、isql -U login_id -P password -S server isql [-?] | [-L] | [<br /> { {-U login_id [-P password]} | -E }<br /> [-S server_name] [-H wksta_name] [-d db_name]<br /> [-l time_out] [-t time_out] [-h headers]<br /> [-s col_separator] [-w column_width] [-a packet_size]<br /> [-e] [-x max_text_size] [-c cmd_end] [-q "query"] [-Q "query"]<br /> [-n] [-m error_level] [-r {0 | 1}]<br /> [-i input_file] [-o output_file] [-p] [-b] [-O] ]-?</div><div>显示 isql 开关的语法摘要。<br /> -L列出在本地配置的服务器和在网络上广播的服务器的名称。<br /> -U login_id用户登录 ID。登录 ID 区分大小写。<br /> -P password 是用户指定的密码。如果未使用 <br /> -P 选项，isql 将提示输入密码。如果在命令提示的末尾使用 -P 选项而不带密码，isql 使用默认密码(NULL)。密码区分大小写。   ISQLPASSWORD 环境变量使您得以为当前会话设置默认密码。因此，不需要通过硬编码来在批处理文件中设置密码。如果没有   为 -P 选项指定密码，isql 首先检查 ISQLPASSWORD 变量。如果未设置值,isql使用默认密码 (NULL)。以下示例 在命令提   示处设置LPASSWORD 变量，然后访问 isql 实用工具:C:\&gt;SET ISQLPASSWORD=abracadabraC:\&gt;isql -E使用信任连接而不请   求密码。<br /> -S server_name<br />  指定要连接到的 SQL Server 默认实例。isql 不支持连接到 SQL Server 2000 命名实例。如果未指定服务器，isql 将连接   到本地计算机上的 SQL Server 默认实例。如果要在网络上从远程计算机执行 isql，则需要此选项。<br /> -H wksta_name 是工作站名称。<br />  工作站名称存储在 sysprocesses.hostname 中并由 sp_who 显示。如果未指定，则采用当前计算机名称。<br /> -d db_name 启动 isql 时发出一个 USE db_name 语句。<br /> -l time_out 指定 isql 登录超时之前的秒数。<br />  如果未指定 time_out 值，则命令无限期地运行。登录到 isql 的默认超时为 8 秒。<br /> -t time_out 指定命令超时之前的秒数。<br />  如果未指定 time_out 值，则命令会无限期地运行；登录到 isql 的默认超时为 8 秒。<br /> -h headers  指定要在列标题之间打印的行数。<br />  默认为每一查询结果集打印一次标题。使用 –1 指定不打印标题。如果使用 –1，则在参数和设置之间不能空格<br />  （可以是 -h-1，不能是 -h –1）。<br /> -s col_separator 指定列分隔符字符，其默认为空格。<br />  若要使用对操作系统有特殊含义的字符（例如 | ; &amp; &lt; &gt;），请将该字符用双引号 (") 引起来。<br /> -w column_width 允许用户设置屏幕输出的宽度。默认为 80 个字符。当输出行达到其最大屏幕宽度时，会拆分为多个行。<br /> -a packet_size 使您得以请求不同大小的数据包。<br />  packet_size 的有效值介于 512 和 65535 之间。Microsoft Windows NT&amp;reg; 版中的 isql 默认值为 8192  ；另  外，Microsoft MS-DOS&amp;reg; 版中的 isql 默认值为 512，但在该版本中也可以请求更大的数据包。数据包大小的增加   可以提高较大脚本执行的性能，在这种执行中 GO 命令之间 SQL 语句的数量很重要。Microsoft 的测试表明 8192 是大容量   复制操作典型的最快设置。可以请求更大的数据包大小，但是如果请求不能得到批准，则 isql 默认为 512。<br /> -e 回显输入。<br /> -x max_text_size 指定返回文本数据的最大长度，以字节为单位。<br />  长于 max_text_size 的文本值将被截断。如果未指定 max_text_size，则文本数据在 4096 字节处截断。<br /> -c cmd_end 指定命令终止符。<br />  默认情况下，通过单独在一行中输入 GO 来终止命令并将其发送到 SQL Server 2000。在重置命令终止时，不要使用对操作   系统有特殊含义的 Transact-SQL 保留字或字符，无论其前面是否有反斜杠。<br /> -q "query" 启动 isql 时执行查询，但是在查询完成时不退出 isql。<br />  （注意查询语句不应包含 GO）。如果从批处理文件中发出查询，可使用 %variables。环境 %variables% 也可用。例如：<br />  SET table = sysobjectsisql /q "Select * from %table%" 将查询用双引号引起来，将查询中嵌入的任何内容用单引号引   起来。<br /> -Q "query" 执行查询，在查询完成时立即退出 isql。<br />  将查询用双引号引起来，将查询中嵌入的任何内容用单引号引起来。<br /> -n 从输入行中删除编号和提示符号 (&gt;)。<br /> -m error_level 自定义错误信息的显示。<br />  显示指定的或更高严重级别错误的消息数、状态和错误级别。不显示严重级别低于指定级别的错误的任何信息。用 -1 指定   与消息一起返回所有标题，即使是信息类的消息。如果使用 –1，则在参数和设置之间不能有空格<br />  （可以是 -m-1，不能是 -m -1）。<br /> -r {0 | 1} 将消息输出重定向到屏幕 (stderr)。<br />  如果未指定参数，或指定参数为 0，那么仅重定向严重级别为 17 或更高的错误信息。<br />  如果指定参数为 1，则将重定向所有消息输出（包括 "print"）。<br /> -i input_file标识包含一批 SQL 语句或存储过程的文件。小于 (&lt;) 比较运算符可以用来代替 –i。<br /> -o output_file 标识从 isql 接收输出的文件。<br />  大于 (&gt;) 比较运算符可以用来代替 –o。-p打印性能统计。<br /> -b 指定错误发生时 isql 退出并返回一个 DOS ERRORLEVEL 值。<br />  当 SQL Server 错误信息的严重级别为 10 或更高时，返回给 DOS ERRORLEVEL变量的值为 1；否则，返回值为 0。MS-DOS    批处理文件可以测试 DOS ERRORLEVEL 的值并适当处理错误。<br /> -O指定 isql 还原为早期版本的行为。下列功能停用： EOF 批处理控制台宽度自动调整宽信息 <br />  该选项还将 DOS ERRORLEVEL 的默认值设置为 –1。<br /></div><img src ="http://www.cnitblog.com/applezk/aggbug/21947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2007-01-16 21:48 <a href="http://www.cnitblog.com/applezk/archive/2007/01/16/21947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Distinct    Group By    Having</title><link>http://www.cnitblog.com/applezk/archive/2006/05/17/10644.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Wed, 17 May 2006 03:41:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2006/05/17/10644.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/10644.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2006/05/17/10644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/10644.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/10644.html</trackback:ping><description><![CDATA[SELECT COUNT(DISTINCT store_name) <br />            FROM Store_Information<br />            查询结果显示为：<br />            Count(DISTINCT store_name) <br />            3 <br />            GROUP BY<br />            下面我们来进一步看一下SQL语言中的集合函数。上文中，我们曾使用SUM函数计算所有商店的销售总额，如果我们希望计算每一家商店各自的总销售额时该怎么办呢？要实现这一目的我们需要做两件事：首先，我们需要查询商店名称和销售额两个字段；然后，我们使用SQL语言的GROUP <br />            BY命令将销售额按照不同的商店进行分组，从而计算出不同商店的销售总额。GROUP BY命令的语法格式为：<br />            SELECT "column_name1", SUM("column_name2") <br />            FROM "table_name" <br />            GROUP BY "column_name1" <br />            我们可以使用如下命令实现上述查询目的：<br />            SELECT store_name, SUM(Sales) <br />            FROM Store_Information <br />            GROUP BY store_name<br />            查询结果显示为：<br />            store_name SUM(Sales) <br />            Los Angeles $1800 <br />            San Diego $250 <br />            Boston $700 <br />            小注：<br />            GROUP BY关键字一般应用于同时查询多个字段并对字段进行算术运算的SQL命令中。<br />            HAVING<br />            用户在使用SQL语言的过程中可能希望解决的另一个问题就是对由sum或其它集合函数运算结果的输出进行限制。例如，我们可能只希望看到Store_Information数据表中销售总额超过1500美圆的商店的信息，这时我们就需要使用HAVING从句。语法格式为：<br />            SELECT "column_name1", SUM("column_name2") <br />            FROM "table_name" <br />            GROUP BY "column_name1" <br />            HAVING (arithematic function condition)<br />            （GROUP BY从句可选）<br />            由此，我们可以使用如下命令实现上述查询目的：<br />            SELECT store_name, SUM(sales) <br />            FROM Store_Information <br />            GROUP BY store_name<br />            HAVING SUM(sales) <a href="mailto:$#@62">$#@62</a>; 1500<br />            查询结果显示为：<br />            store_name SUM(Sales) <br />            Los Angeles $1800 <img src ="http://www.cnitblog.com/applezk/aggbug/10644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2006-05-17 11:41 <a href="http://www.cnitblog.com/applezk/archive/2006/05/17/10644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> SQL Server实用操作小技巧集合</title><link>http://www.cnitblog.com/applezk/archive/2006/05/16/10588.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 16 May 2006 03:29:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2006/05/16/10588.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/10588.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2006/05/16/10588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/10588.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/10588.html</trackback:ping><description><![CDATA[包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等 
<p>　　(一)挂起操作</p><p>　　在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作，要求重启，这里往往重启无用，解决办法:</p><p>　　到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager</p><p>　　删除PendingFileRenameOperations</p><p>　　(二)收缩数据库</p><p>　　--重建索引</p><p>　　DBCC REINDEX</p><p>　　DBCC INDEXDEFRAG</p><p>　　--收缩数据和日志</p><p>　　DBCC SHRINKDB</p><p>　　DBCC SHRINKFILE</p><p>　　(三)压缩数据库</p><p>　　dbcc shrinkdatabase(dbname)</p><p>　　(四)转移数据库给新用户以已存在用户权限</p><p>　　exec sp_change_users_login 'update_one','newname','oldname'</p><p>　　go</p><p>　　(五)检查备份集</p><p>　　RESTORE VERIFYONLY from disk='E:\dvbbs.bak'</p><p>　　(六)修复数据库</p><p>　　ALTER DATABASE [dvbbs] SET SINGLE_USER</p><p>　　GO</p><p>　　DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK</p><p>　　GO</p><p>　　ALTER DATABASE [dvbbs] SET MULTI_USER</p><p>　　GO</p><p>　　--CHECKDB 有3个参数:</p><p>　　--REPAIR_ALLOW_DATA_LOSS</p><p>　　-- 执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。</p><p>　　--REPAIR_FAST 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。</p><p>　　--REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。</p><p>　　--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY<br /></p><img src ="http://www.cnitblog.com/applezk/aggbug/10588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2006-05-16 11:29 <a href="http://www.cnitblog.com/applezk/archive/2006/05/16/10588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>删除数据库中重复数据的几个方法</title><link>http://www.cnitblog.com/applezk/archive/2006/05/16/10584.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 16 May 2006 03:07:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2006/05/16/10584.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/10584.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2006/05/16/10584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/10584.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/10584.html</trackback:ping><description><![CDATA[declare @max integer,@id integer 
<p>　　declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) &gt; 1</p><p>　　open cur_rows</p><p>　　fetch cur_rows into @id,@max</p><p>　　while @@fetch_status=0</p><p>　　begin</p><p>　　select @max = @max -1</p><p>　　set rowcount @max</p><p>　　delete from 表名 where 主字段 = @id</p><p>　　fetch cur_rows into @id,@max</p><p>　　end</p><p>　　close cur_rows</p><p>　　set rowcount 0</p><p>　　方法二</p><p>　　有两个意义上的重复记录，一是完全重复的记录，也即所有字段均重复的记录，二是部分关键字段重复的记录，比如Name字段重复，而其他字段不一定重复或都重复可以忽略。</p><p>　　1、对于第一种重复，比较容易解决，使用</p><p>　　select distinct * from tableName</p><p>　　就可以得到无重复记录的结果集。</p><p>　　如果该表需要删除重复的记录(重复记录保留1条)，可以按以下方法删除</p><p>　　select distinct * into #Tmp from tableName</p><p>　　drop table tableName</p><p>　　select * into tableName from #Tmp</p><p>　　drop table #Tmp</p><p>　　发生这种重复的原因是表设计不周产生的，增加唯一索引列即可解决。</p><p>　　2、这类重复问题通常要求保留重复记录中的第一条记录，操作方法如下</p><p>　　假设有重复的字段为Name,Address，要求得到这两个字段唯一的结果集</p><p>　　select identity(int,1,1) as autoID, * into #Tmp from tableName</p><p>　　select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID</p><p>　　select * from #Tmp where autoID in(select autoID from #tmp2)</p><p>　　最后一个select即得到了Name，Address不重复的结果集(但多了一个autoID字段，实际写时可以写在select子句中省去此列)</p><p>       如果大家还有好的办法,希望您能将思路或例子与大家分享!!<br /></p><img src ="http://www.cnitblog.com/applezk/aggbug/10584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2006-05-16 11:07 <a href="http://www.cnitblog.com/applezk/archive/2006/05/16/10584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL SERVER日志清除的两种方法</title><link>http://www.cnitblog.com/applezk/archive/2006/05/16/10583.html</link><dc:creator>applezk's IT blog</dc:creator><author>applezk's IT blog</author><pubDate>Tue, 16 May 2006 03:03:00 GMT</pubDate><guid>http://www.cnitblog.com/applezk/archive/2006/05/16/10583.html</guid><wfw:comment>http://www.cnitblog.com/applezk/comments/10583.html</wfw:comment><comments>http://www.cnitblog.com/applezk/archive/2006/05/16/10583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/applezk/comments/commentRss/10583.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/applezk/services/trackbacks/10583.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">  
<p>在使用过程中大家经常碰到数据库日志非常大的情况，在这里介绍了两种处理方法…… <br />　　方法一</p><p>　　一般情况下，SQL数据库的收缩并不能很大程度上减小数据库大小，其主要作用是收缩日志大小，应当定期进行此操作以免数据库日志过大</p><p>　　1、设置数据库模式为简单模式:打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器--&gt;双击打开数据库目录--&gt;选择你的数据库名称(如论坛数据库Forum)--&gt;然后点击右键选择属性--&gt;选择选项--&gt;在故障还原的模式中选择“简单”，然后按确定保存</p><p>　　2、在当前数据库上点右键，看所有任务中的收缩数据库，一般里面的默认设置不用调整，直接点确定</p><p>　　3、收缩数据库完成后，建议将您的数据库属性重新设置为标准模式，操作方法同第一点，因为日志在一些异常情况下往往是恢复数据库的重要依据</p><p>　　方法二</p><p>　　SET NOCOUNT ON</p><p>　　DECLARE @LogicalFileName sysname,</p><p>　　@MaxMinutes INT,</p><p>　　@NewSize INT</p><p>　　USE tablename -- 要操作的数据库名</p><p>　　SELECT @LogicalFileName = 'tablename_log', -- 日志文件名</p><p>　　@MaxMinutes = 10, -- Limit on time allowed to wrap log.</p><p>　　@NewSize = 1 -- 你想设定的日志文件的大小(M)</p><p>　　-- Setup / initialize</p><p>　　DECLARE @OriginalSize int</p><p>　　SELECT @OriginalSize = size</p><p>　　FROM sysfiles</p><p>　　WHERE name = @LogicalFileName</p><p>　　SELECT 'Original Size of ' + db_name() + ' LOG is ' +</p><p>　　CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +</p><p>　　CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'</p><p>　　FROM sysfiles</p><p>　　WHERE name = @LogicalFileName</p><p>　　CREATE TABLE DummyTrans</p><p>　　(DummyColumn char (8000) not null)</p><p>　　DECLARE @Counter INT,</p><p>　　@StartTime DATETIME,</p><p>　　@TruncLog VARCHAR(255)</p><p>　　SELECT @StartTime = GETDATE(),</p><p>　　@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'</p><p>　　DBCC SHRINKFILE (@LogicalFileName, @NewSize)</p><p>　　EXEC (@TruncLog)</p><p>　　-- Wrap the log if necessary.</p><p>　　WHILE @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired</p><p>　　AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)</p><p>　　AND (@OriginalSize * 8 /1024) &gt; @NewSize</p><p>　　BEGIN -- Outer loop.</p><p>　　SELECT @Counter = 0</p><p>　　WHILE ((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000))</p><p>　　BEGIN -- update</p><p>　　INSERT DummyTrans VALUES ('Fill Log')</p><p>　　DELETE DummyTrans</p><p>　　SELECT @Counter = @Counter + 1</p><p>　　END</p><p>　　EXEC (@TruncLog)</p><p>　　END</p><p>　　SELECT 'Final Size of ' + db_name() + ' LOG is ' +</p><p>　　CONVERT(VARCHAR(30),size) + ' 8K pages or ' +</p><p>　　CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'</p><p>　　FROM sysfiles</p><p>　　WHERE name = @LogicalFileName</p><p>　　DROP TABLE DummyTrans</p><p>　　SET NOCOUNT OFF</p></span>
<img src ="http://www.cnitblog.com/applezk/aggbug/10583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/applezk/" target="_blank">applezk's IT blog</a> 2006-05-16 11:03 <a href="http://www.cnitblog.com/applezk/archive/2006/05/16/10583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>