﻿<?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-丄諦啲仇魜ヤ              -文章分类-数据库</title><link>http://www.blogjava.net/Crying/category/26023.html</link><description>如 果 敌 人 让 你 生 气 , 那 说 明 你 没 有 胜 他 的 把 握！ 
</description><language>zh-cn</language><lastBuildDate>Sat, 24 May 2008 23:32:25 GMT</lastBuildDate><pubDate>Sat, 24 May 2008 23:32:25 GMT</pubDate><ttl>60</ttl><item><title>SQL优化原则</title><link>http://www.blogjava.net/Crying/articles/202523.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Fri, 23 May 2008 16:53:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/202523.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/202523.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/202523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/202523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/202523.html</trackback:ping><description><![CDATA[<p>1、使用索引来更快地遍历表。 <br />
缺省情况下建立的索引是非群集索引，但有时它并不是最佳的。在非群集索引下，数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说： <br />
a.有大量重复值、且经常有范围查询（ &gt; ,&lt; ，&gt; =,&lt; =）和order by、group by发生的列，可考虑建立群集索引； <br />
b.经常同时存取多列，且每列都含有重复值可考虑建立组合索引； <br />
c.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好，恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引，维护索引集合就要做相应的更新工作。 <br />
2、在海量查询时尽量少用格式转换。 <br />
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语，任何一种索引都有助于SELECT的性能提高。 <br />
7、任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。 <br />
4、IN、OR子句常会使用工作表，使索引失效。如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。</p>
<p>Sql的优化原则2： <br />
1、只要能满足你的需求，应尽可能使用更小的数据类型：例如使用MEDIUMINT代替INT <br />
2、尽量把所有的列设置为NOT NULL，如果你要保存NULL，手动去设置它，而不是把它设为默认值。 <br />
3、尽量少用VARCHAR、TEXT、BLOB类型 <br />
4、如果你的数据只有你所知的少量的几个。最好使用ENUM类型 <br />
5、正如graymice所讲的那样，建立索引。 <br />
以下是我做的一个实验，可以发现索引能极大地提高查询的效率：</p>
<p>我有一个会员信息表users，里边有37365条用户记录：</p>
<p>在不加索引的时候进行查询： <br />
sql语句A: <br />
select * from users where username like &#8217;%许%&#8217;; <br />
在Mysql-Front中的8次查询时长为：1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录</p>
<p>sql语句B: <br />
select * from users where username like &#8217;许%&#8217;; <br />
在Mysql-Front中的8次查询时长为：0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录</p>
<p>sql语句C: <br />
select * from users where username like &#8217;%许&#8217;; <br />
在Mysql-Front中的8次查询时长为：0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录</p>
<p>为username列添加索引: <br />
create index usernameindex on users(username(6));</p>
<p>再次查询： <br />
sql语句A: <br />
select * from users where username like &#8217;%许%&#8217;; <br />
在Mysql-Front中的8次查询时长为：0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录</p>
<p>sql语句B: <br />
select * from users where username like &#8217;许%&#8217;; <br />
在Mysql-Front中的8次查询时长为：0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录</p>
<p>sql语句C: <br />
select * from users where username like &#8217;%许&#8217;; <br />
在Mysql-Front中的8次查询时长为：0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录</p>
<p>在实验过程中，我没有另开任何程序，以上的数据说明在单表查询中，建立索引的可以极大地提高查询速度。 <br />
另外要说的是如果建立了索引，对于like &#8217;许%&#8217;类型的查询，速度提升是最明显的。因此，我们在写sql语句的时候也尽量采用这种方式查询。</p>
<p>对于多表查询我们的优化原则是：</p>
<p>尽量将索引建立在：left join on/right join on ...　＋条件，的条件语句中所涉及的字段上。</p>
<p>多表查询比单表查询更能体现索引的优势。</p>
<p>6、索引的建立原则： <br />
如果一列的中数据的前缀重复值很少，我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短，占用的</p>
<p>磁盘空间越少，在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。</p>
<p>在很多场合，我们可以给建立多列数据建立索引。</p>
<p>索引应该建立在查询条件中进行比较的字段上，而不是建立在我们要找出来并且显示的字段上</p>
<p>7、限制索引的使用的避归。<br />
7.1 IN、OR子句常会使用工作表，使索引失效。<br />
如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。这句话怎么理解决，请举个例子</p>
<p>例子如下: <br />
如果在fields1和fields2上同时建立了索引，fields1为主索引 <br />
以下sql会用到索引 <br />
select * from tablename1 where fields1=&#8217;value1&#8217; and fields2=&#8217;value2&#8217; <br />
以下sql不会用到索引 <br />
select * from tablename1 where fields1=&#8217;value1&#8217; or fields2=&#8217;value2&#8217; <br />
7.2 使用IS NULL 或IS NOT NULL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开&nbsp;&nbsp;&nbsp;&nbsp; 发人员在建表时，把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值，就不会使用这个索引（除非索引是一个位图索引，关于位图索引在稍后在详细讨论）。</p>
<p>7.3 使用函数<br />
如果不使用基于函数的索引，那么在SQL语句的WHERE子句中对存在索引的列使用函数时，会使优化器忽略掉这些索引。下面的查询不会使用索引（只要它不是基于函数的索引）<br />
&nbsp;&nbsp; select empno,ename,deptno<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp; emp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where trunc(hiredate)='01-MAY-81';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把上面的语句改成下面的语句，这样就可以通过索引进行查找。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select empno,ename,deptno<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp; emp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where hiredate&lt;(to_date('01-MAY-81')+0.9999);</p>
<p>7.4 比较不匹配的数据类型<br />
比较不匹配的数据类型也是比较难于发现的性能问题之一。注意下面查询的例子，account_number是一个VARCHAR2类型，在account_number字段上有索引。下面的语句将执行全表扫描。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select bank_name,address,city,state,zip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp; banks<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where account_number = 990354;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle可以自动把where子句变成to_number(account_number)=990354，这样就限制了索引的使用,改成下面的查询就可以使用索引：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select bank_name,address,city,state,zip<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp;&nbsp; banks<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where account_number ='990354';<br />
&nbsp;&nbsp;&nbsp;&nbsp; 特别注意：不匹配的数据类型之间比较会让Oracle自动限制索引的使用，即便对这个查询执行Explain Plan也不能让您明白为什么做了一&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 次&#8220;全表扫描&#8221;。</p>
<p>补充: <br />
1.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间. <br />
有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; <br />
这个视实际情况而定,通常情况下索引是必需的. <br />
2.我在对查询效率有怀疑的时候,一般是直接用Mysql的Explain来跟踪查询情况. <br />
你用Mysql-Front是通过时长来比较,我觉得如果从查询时扫描字段的次数来比较更精确一些.</p>
<img src ="http://www.blogjava.net/Crying/aggbug/202523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2008-05-24 00:53 <a href="http://www.blogjava.net/Crying/articles/202523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些金典的SQL语句</title><link>http://www.blogjava.net/Crying/articles/202521.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Fri, 23 May 2008 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/202521.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/202521.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/202521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/202521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/202521.html</trackback:ping><description><![CDATA[<p style="line-height: 180%" align="left">作为一名programmer，积累代码是很重要的。下面是我从网上搜集得到的一些精彩的SQL代码，可以作为平常编写SQL代码时做参考之用。</p>
<p style="line-height: 180%" align="left"></p>
<p style="line-height: 180%" align="left">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<ul>
    <li><font color="#ff0000">说明：复制表(只复制结构,源表名：a 新表名：b) </font><br />
    select * into b from a where 1&lt;&gt;1
    <li><font color="#ff0000">说明：拷贝表(拷贝数据,源表名：a 目标表名：b)</font><br />
    insert into b(a, b, c) select d,e,f from b;
    <li><font color="#ff0000">说明：显示文章、提交人和最后回复时间</font><br />
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    <li><font color="#ff0000">说明：外连接查询(表名1：a 表名2：b)</font><br />
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    <li><font color="#ff0000">说明：日程安排提前五分钟提醒</font><br />
    select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5
    <li><font color="#ff0000">说明：两张关联表，删除主表中已经在副表中没有的信息</font><br />
    delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
    <li><font color="#ff0000">说明：-- </font><br />
    <br />
    SQL: <br />
    <br />
    SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE <br />
    <br />
    FROM TABLE1, <br />
    <br />
    (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE <br />
    <br />
    FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND <br />
    <br />
    FROM TABLE2 <br />
    <br />
    WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, <br />
    <br />
    (SELECT NUM, UPD_DATE, STOCK_ONHAND <br />
    <br />
    FROM TABLE2 <br />
    <br />
    WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = <br />
    <br />
    TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, <br />
    <br />
    WHERE X.NUM = Y.NUM （+） <br />
    <br />
    AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) &lt;&gt; X.STOCK_ONHAND ) B <br />
    <br />
    WHERE A.NUM = B.NUM
    <li><font color="#ff0000">说明：-- </font><br />
    select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&amp;strdepartmentname&amp;"' and 专业名称='"&amp;strprofessionname&amp;"' order by 性别,生源地,高考总成绩
    <li><font color="#ff0000">从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源） </font><br />
    <br />
    SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, <br />
    <br />
    SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC <br />
    <br />
    FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration <br />
    <br />
    FROM TELFEESTAND a, TELFEE b <br />
    <br />
    WHERE a.tel = b.telfax) a <br />
    <br />
    GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
    <li><font color="#ff0000">说明：四表联查问题</font><br />
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
    <li>说明：得到表中最小的未使用的ID号
    <li>SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
    <li><font color="#ff0000">一个SQL语句的问题:行列转换</font><br />
    select * from v_temp<br />
    上面的视图结果如下:<br />
    user_name role_name<br />
    -------------------------<br />
    系统管理员 管理员 <br />
    feng 管理员 <br />
    feng 一般用户 <br />
    test 一般用户 <br />
    想把结果变成这样:<br />
    user_name role_name<br />
    ---------------------------<br />
    系统管理员 管理员 <br />
    feng 管理员,一般用户 <br />
    test 一般用户<br />
    ===================<br />
    create table a_test(name varchar(20),role2 varchar(20))<br />
    insert into a_test values('李','管理员')<br />
    insert into a_test values('张','管理员')<br />
    insert into a_test values('张','一般用户')<br />
    insert into a_test values('常','一般用户')<br />
    <br />
    create function join_str(@content varchar(100))<br />
    returns varchar(2000)<br />
    as<br />
    begin<br />
    declare @str varchar(2000)<br />
    set @str=''<br />
    select @str=@str+','+rtrim(role2) from a_test where [name]=@content<br />
    select @str=right(@str,len(@str)-1)<br />
    return @str<br />
    end<br />
    go<br />
    <br />
    --调用：<br />
    select [name],dbo.join_str([name]) role2 from a_test group by [name]<br />
    <br />
    --select distinct name,dbo.uf_test(name) from a_test
    <li><font color="#ff0000">快速比较结构相同的两表</font><br />
    结构相同的两表，一表有记录3万条左右，一表有记录2万条左右，我怎样快速查找两表的不同记录？<br />
    ============================<br />
    给你一个测试方法，从northwind中的orders表取数据。<br />
    select * into n1 from orders<br />
    select * into n2 from orders<br />
    <br />
    select * from n1<br />
    select * from n2<br />
    <br />
    --添加主键，然后修改n1中若干字段的若干条<br />
    alter table n1 add constraint pk_n1_id primary key (OrderID)<br />
    alter table n2 add constraint pk_n2_id primary key (OrderID)<br />
    <br />
    select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) &gt; 1<br />
    <br />
    应该可以，而且将不同的记录的ID显示出来。<br />
    下面的适用于双方记录一样的情况，<br />
    <br />
    select * from n1 where orderid in (select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) &gt; 1) <br />
    至于双方互不存在的记录是比较好处理的<br />
    --删除n1,n2中若干条记录<br />
    delete from n1 where orderID in ('10728','10730')<br />
    delete from n2 where orderID in ('11000','11001')<br />
    <br />
    --*************************************************************<br />
    -- 双方都有该记录却不完全相同<br />
    select * from n1 where orderid in(select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) &gt; 1)<br />
    union<br />
    --n2中存在但在n1中不存的在10728,10730<br />
    select * from n1 where OrderID not in (select OrderID from n2)<br />
    union<br />
    --n1中存在但在n2中不存的在11000,11001<br />
    select * from n2 where OrderID not in (select OrderID from n1)
    <li><font color="#ff0000">四种方法取表里n到m条纪录：</font><br />
    <br />
    1.<br />
    select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入<br />
    set rowcount n<br />
    select * from 表变量 order by columnname desc<br />
    <br />
    <br />
    2.<br />
    select top n * from (select top m * from tablename order by columnname) a order by columnname desc<br />
    <br />
    <br />
    3.如果tablename里没有其他identity列，那么：<br />
    select identity(int) id0,* into #temp from tablename<br />
    <br />
    取n到m条的语句为：<br />
    select * from #temp where id0 &gt;=n and id0 &lt;= m<br />
    <br />
    如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行：<br />
    exec sp_dboption 你的DB名字,'select into/bulkcopy',true<br />
    <br />
    <br />
    4.如果表里有identity属性，那么简单：<br />
    select * from tablename where identitycol between n and m
    <li><font color="#ff0000">如何删除一个表中重复的记录？</font><br />
    create table a_dist(id int,name varchar(20))<br />
    <br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    <br />
    exec up_distinct 'a_dist','id'<br />
    <br />
    select * from a_dist<br />
    <br />
    create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))<br />
    --f_key表示是分组字段﹐即主键字段<br />
    as<br />
    begin<br />
    declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br />
    select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) &gt; 1'<br />
    exec(@sql)<br />
    open cur_rows <br />
    fetch cur_rows into @id,@max <br />
    while @@fetch_status=0 <br />
    begin <br />
    select @max = @max -1 <br />
    set rowcount @max <br />
    select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key<br />
    if @type=56<br />
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id <br />
    if @type=167<br />
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' <br />
    exec(@sql)<br />
    fetch cur_rows into @id,@max <br />
    end <br />
    close cur_rows <br />
    deallocate cur_rows<br />
    set rowcount 0<br />
    end<br />
    <br />
    select * from systypes<br />
    select * from syscolumns where id = object_id('a_dist')
    <li><font color="#ff0000">查询数据的最大排序问题（只能用一条语句写） </font><br />
    CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) <br />
    <br />
    insert into hard values ('A','1',3)<br />
    insert into hard values ('A','2',4)<br />
    insert into hard values ('A','4',2)<br />
    insert into hard values ('A','6',9)<br />
    insert into hard values ('B','1',4)<br />
    insert into hard values ('B','2',5)<br />
    insert into hard values ('B','3',6)<br />
    insert into hard values ('C','3',4)<br />
    insert into hard values ('C','6',7)<br />
    insert into hard values ('C','2',3)<br />
    <br />
    <br />
    要求查询出来的结果如下：<br />
    <br />
    qu co je <br />
    ----------- ----------- ----- <br />
    A 6 9<br />
    A 2 4<br />
    B 3 6<br />
    B 2 5<br />
    C 6 7<br />
    C 3 4<br />
    <br />
    <br />
    就是要按qu分组，每组中取je最大的前2位！！<br />
    而且只能用一句sql语句！！！<br />
    select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
    <li><font color="#ff0000">求删除重复记录的sql语句？ </font><br />
    怎样把具有相同字段的纪录删除，只留下一条。<br />
    例如，表test里有id,name字段<br />
    如果有name相同的记录 只留下一条，其余的删除。<br />
    name的内容不定，相同的记录数不定。<br />
    有没有这样的sql语句？<br />
    ==============================<br />
    A:一个完整的解决方案：<br />
    <br />
    将重复的记录记入temp1表:<br />
    select [标志字段id],count(*) into temp1 from [表名]<br />
    group by [标志字段id]<br />
    having count(*)&gt;1<br />
    <br />
    2、将不重复的记录记入temp1表:<br />
    insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1<br />
    <br />
    3、作一个包含所有不重复记录的表：<br />
    select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)<br />
    <br />
    4、删除重复表:<br />
    delete [表名]<br />
    <br />
    5、恢复表：<br />
    insert [表名] select * from temp2<br />
    <br />
    6、删除临时表:<br />
    drop table temp1<br />
    drop table temp2<br />
    ================================<br />
    B:<br />
    create table a_dist(id int,name varchar(20))<br />
    <br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    insert into a_dist values(1,'abc')<br />
    <br />
    exec up_distinct 'a_dist','id'<br />
    <br />
    select * from a_dist<br />
    <br />
    create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))<br />
    --f_key表示是分组字段﹐即主键字段<br />
    as<br />
    begin<br />
    declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br />
    select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) &gt; 1'<br />
    exec(@sql)<br />
    open cur_rows <br />
    fetch cur_rows into @id,@max <br />
    while @@fetch_status=0 <br />
    begin <br />
    select @max = @max -1 <br />
    set rowcount @max <br />
    select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key<br />
    if @type=56<br />
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id <br />
    if @type=167<br />
    select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' <br />
    exec(@sql)<br />
    fetch cur_rows into @id,@max <br />
    end <br />
    close cur_rows <br />
    deallocate cur_rows<br />
    set rowcount 0<br />
    end<br />
    <br />
    select * from systypes<br />
    select * from syscolumns where id = object_id('a_dist')
    <li><font color="#ff0000">行列转换--普通 </font><br />
    <br />
    假设有张学生成绩表(CJ)如下 <br />
    Name Subject Result <br />
    张三 语文 80 <br />
    张三 数学 90 <br />
    张三 物理 85 <br />
    李四 语文 85 <br />
    李四 数学 92 <br />
    李四 物理 82 <br />
    <br />
    想变成 <br />
    姓名 语文 数学 物理 <br />
    张三 80 90 85 <br />
    李四 85 92 82 <br />
    <br />
    declare @sql varchar(4000) <br />
    set @sql = 'select Name' <br />
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' <br />
    from (select distinct Subject from CJ) as a <br />
    select @sql = @sql+' from test group by name' <br />
    exec(@sql) <br />
    <br />
    行列转换--合并 <br />
    <br />
    有表A, <br />
    id pid <br />
    1 1 <br />
    1 2 <br />
    1 3 <br />
    2 1 <br />
    2 2 <br />
    3 1 <br />
    如何化成表B: <br />
    id pid <br />
    1 1,2,3 <br />
    2 1,2 <br />
    3 1 <br />
    <br />
    创建一个合并的函数 <br />
    create function fmerg(@id int) <br />
    returns varchar(8000) <br />
    as <br />
    begin <br />
    declare @str varchar(8000) <br />
    set @str='' <br />
    select @str=@str+','+cast(pid as varchar) from 表A where id=@id <br />
    set @str=right(@str,len(@str)-1) <br />
    return(@str) <br />
    End <br />
    go <br />
    <br />
    --调用自定义函数得到结果 <br />
    select distinct id,dbo.fmerg(id) from 表A
    <li><font color="#ff0000">如何取得一个数据表的所有列名 </font><br />
    <br />
    方法如下：先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。 <br />
    SQL语句如下： <br />
    declare @objid int,@objname char(40) <br />
    set @objname = 'tablename' <br />
    select @objid = id from sysobjects where id = object_id(@objname) <br />
    select 'Column_name' = name from syscolumns where id = @objid order by colid <br />
    <br />
    或<br />
    <br />
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'
    <li><font color="#ff0000">通过SQL语句来更改用户的密码 </font><br />
    <br />
    修改别人的,需要sysadmin role <br />
    EXEC sp_password NULL, 'newpassword', 'User' <br />
    <br />
    如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa
    <li><font color="#ff0000">怎么判断出一个表的哪些字段不允许为空？ </font><br />
    <br />
    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
    <li><font color="#ff0000">如何在数据库里找到含有相同字段的表？ </font><br />
    a. 查已知列名的情况 <br />
    SELECT b.name as TableName,a.name as columnname <br />
    From syscolumns a INNER JOIN sysobjects b <br />
    ON a.id=b.id <br />
    AND b.type='U' <br />
    AND a.name='你的字段名字'
    <li><font color="#ff0000">未知列名查所有在不同表出现过的列名 </font><br />
    Select o.name As tablename,s1.name As columnname <br />
    From syscolumns s1, sysobjects o <br />
    Where s1.id = o.id <br />
    And o.type = 'U' <br />
    And Exists ( <br />
    Select 1 From syscolumns s2 <br />
    Where s1.name = s2.name <br />
    And s1.id &lt;&gt; s2.id <br />
    )
    <li><font color="#ff0000">查询第xxx行数据 </font><br />
    <br />
    假设id是主键： <br />
    select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) <br />
    <br />
    如果使用游标也是可以的 <br />
    fetch absolute [number] from [cursor_name] <br />
    行数为绝对行数
    <li><font color="#ff0000">SQL Server日期计算 </font><br />
    a. 一个月的第一天 <br />
    SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) <br />
    b. 本周的星期一 <br />
    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) <br />
    c. 一年的第一天 <br />
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) <br />
    d. 季度的第一天 <br />
    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) <br />
    e. 上个月的最后一天 <br />
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) <br />
    f. 去年的最后一天 <br />
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) <br />
    g. 本月的最后一天 <br />
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) <br />
    h. 本月的第一个星期一 <br />
    select DATEADD(wk, DATEDIFF(wk,0, <br />
    dateadd(dd,6-datepart(day,getdate()),getdate()) <br />
    ), 0) <br />
    i. 本年的最后一天 <br />
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
    <li><font color="#ff0000">获取表结构[把 'sysobjects' 替换 成 'tablename' 即可] </font><br />
    <br />
    SELECT CASE IsNull(I.name, '') <br />
    When '' Then '' <br />
    Else '*' <br />
    End as IsPK, <br />
    Object_Name(A.id) as t_name, <br />
    A.name as c_name, <br />
    IsNull(SubString(M.text, 1, 254), '') as pbc_init, <br />
    T.name as F_DataType, <br />
    CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '') <br />
    WHEN '' Then Cast(A.prec as varchar) <br />
    ELSE Cast(A.prec as varchar) + ',' + Cast(A.scale as varchar) <br />
    END as F_Scale, <br />
    A.isnullable as F_isNullAble <br />
    FROM Syscolumns as A <br />
    JOIN Systypes as T <br />
    ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') ) <br />
    LEFT JOIN ( SysIndexes as I <br />
    JOIN Syscolumns as A1 <br />
    ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status &amp; 0x800) = 0x800 AND A1.colid &lt;= I.keycnt) ) <br />
    ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) ) <br />
    LEFT JOIN SysComments as M <br />
    ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 ) <br />
    ORDER BY A.Colid ASC
    <li><font color="#ff0000">提取数据库内所有表的字段详细说明的SQL语句 </font><br />
    <br />
    SELECT <br />
    (case when a.colorder=1 then d.name else '' end) N'表名', <br />
    a.colorder N'字段序号', <br />
    a.name N'字段名', <br />
    (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '&#8730;'else '' <br />
    end) N'标识', <br />
    (case when (SELECT count(*) <br />
    FROM sysobjects <br />
    WHERE (name in <br />
    (SELECT name <br />
    FROM sysindexes <br />
    WHERE (id = a.id) AND (indid in <br />
    (SELECT indid <br />
    FROM sysindexkeys <br />
    WHERE (id = a.id) AND (colid in <br />
    (SELECT colid <br />
    FROM syscolumns <br />
    WHERE (id = a.id) AND (name = a.name))))))) AND <br />
    (xtype = 'PK'))&gt;0 then '&#8730;' else '' end) N'主键', <br />
    b.name N'类型', <br />
    a.length N'占用字节数', <br />
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度', <br />
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数', <br />
    (case when a.isnullable=1 then '&#8730;'else '' end) N'允许空', <br />
    isnull(e.text,'') N'默认值', <br />
    isnull(g.[value],'') AS N'字段说明' <br />
    FROM syscolumns a <br />
    left join systypes b <br />
    on a.xtype=b.xusertype <br />
    inner join sysobjects d <br />
    on a.id=d.id and d.xtype='U' and d.name&lt;&gt;'dtproperties' <br />
    left join syscomments e <br />
    on a.cdefault=e.id <br />
    left join sysproperties g <br />
    on a.id=g.id AND a.colid = g.smallid <br />
    order by object_name(a.id),a.colorder
    <li><font color="#ff0000">快速获取表test的记录总数[对大容量表非常有效] </font><br />
    <br />
    快速获取表test的记录总数: <br />
    select rows from sysindexes where id = object_id('test') and indid in (0,1)<br />
    <br />
    update 2 set KHXH=(ID+1)\2 2行递增编号<br />
    update [23] set id1 = 'No.'+right('00000000'+id,6) where id not like 'No%' //递增<br />
    update [23] set id1= 'No.'+right('00000000'+replace(id1,'No.',''),6) //补位递增<br />
    delete from [1] where (id%2)=1 <br />
    奇数
    <li><font color="#ff0000">替换表名字段</font><br />
    update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'
    <li><font color="#ff0000">截位</font><br />
    SELECT LEFT(表名, 5) </li>
</ul>
<p>另：</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>1.把某个字段重新生气序列(从1到n):<br />
DECLARE @i int<br />
Set @i = 0<br />
Update Table1 Set @i = @i + 1,Field1 = @i</p>
<p>2.按成绩排名次<br />
Update 成绩表<br />
Set a.名次 = (<br />
Select Count(*) + 1<br />
From 成绩表 b<br />
Where a.总成绩 &lt; b.总成绩<br />
)<br />
From 成绩表 a</p>
<p>3.查询外部数据库<br />
Select a.*<br />
From OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';'',Table1) a</p>
<p>4.查询Excel文件<br />
Select * <br />
From OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$</p>
<p>5.在查询中指定排序规则<br />
Select * From Table1 Order By Field1 COLLATE Chinese_PRC_BIN<br />
为什么要指定排序规则呢?参见:<br />
<a href="http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985">http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985</a><br />
例,检查数据库中的Pub_Users表中是否存在指定的用户:<br />
Select Count(*) From Pub_Users Where [UserName]='admin' And [PassWord]='aaa' COLLATE Chinese_PRC_BIN<br />
默认比较是不区分大小写的,如果不加COLLATE Chinese_PRC_BIN,那么密码aaa与AAA是等效的,这当然与实际不符.注意的是,每个条件都要指定排序规则,上例中用户名就不区分大小写.</p>
<p><br />
6.Order By的一个小技巧<br />
Order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)<br />
Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a Order By 3</p>
<img src ="http://www.blogjava.net/Crying/aggbug/202521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2008-05-24 00:50 <a href="http://www.blogjava.net/Crying/articles/202521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将orcale 中的CLOB类型  转成String</title><link>http://www.blogjava.net/Crying/articles/196784.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Mon, 28 Apr 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/196784.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/196784.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/196784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/196784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/196784.html</trackback:ping><description><![CDATA[DBUtil类中的一个静态方法：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * 将CLOB转成String ,静态方法<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @param clob 字段<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @return 内容字串，如果出现错误，返回null<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp; public final static String clob2String(Clob clob)<br />
&nbsp;&nbsp;&nbsp; &nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (clob == null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer(65535);//64K<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Reader clobStream = null;//创建一个输入流对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clobStream = clob.getCharacterStream();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char[] b = new char[60000];//每次获取60K<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((i = clobStream.read(b)) != -1)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(b,0,i);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; catch(Exception ex)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (clobStream != null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clobStream.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (sb == null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sb.toString();<br />
&nbsp;&nbsp;&nbsp; &nbsp; }<br />
<br />
//row是一个对象（JAVABEAN）类<br />
有个private String topic 属性；<br />
rs 是一个ResultSet<br />
&nbsp;row.setTopic(DBUtil.clob2String((Clob)rs.getClob("topic")));<br />
<br />
<img src ="http://www.blogjava.net/Crying/aggbug/196784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2008-04-28 15:51 <a href="http://www.blogjava.net/Crying/articles/196784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 中将一个数字转换为英文（转）</title><link>http://www.blogjava.net/Crying/articles/195600.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 24 Apr 2008 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/195600.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/195600.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/195600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/195600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/195600.html</trackback:ping><description><![CDATA[运行select to_char(to_date('911','J'),'Jsp') as a from dual<br />
显示结果为:Nine Hundred
Eleven<br />
而运行select to_date('911','J') as a from
dual<br />
显示结果为:0000-0-0<br />
<br />
<span style="color: red;">关于to_date(numberstring,'J')和to_char后面的那个"Jsp"各有什么作用?</span><br />
<br />
<br />
J：Julian day; the number of days since January 1, 4712 BC. Number specified with
'J' must be integers.<br />
SP：Spelled
Number<br />
他的做法是先把数字转为一个数字，然后再转换回来，加上SP，就可以拼写出这个数字了。<br />
<br />
<img src ="http://www.blogjava.net/Crying/aggbug/195600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2008-04-24 15:35 <a href="http://www.blogjava.net/Crying/articles/195600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>卸载oracle 9i</title><link>http://www.blogjava.net/Crying/articles/195594.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 24 Apr 2008 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/195594.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/195594.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/195594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/195594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/195594.html</trackback:ping><description><![CDATA[1.&nbsp; 停止oracle所有的服务<br />
2. &nbsp; 开始 --&gt; 程序 --&gt; Oracle Installation Products --&gt; Universal Installer
--&gt; 卸载所有oracle 产品，但Universal Installer本身不能被删除<br />
3. 开始 --&gt;运行 regedit<br />
&nbsp;&nbsp; （1）选择 HKEY_LOCAL_MACHINE\SOFTWARE ，删除Oracle目录<br />
&nbsp;&nbsp; （2）选择 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services ，删除所有Oracle项<br />
&nbsp;&nbsp; （3）选择 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services ，删除所有Oracle项<br />
&nbsp;&nbsp; （4）选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下，删除所有Oracle项<br />
&nbsp; （5）选择
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application删除所有 Oracle项<br />
4.重新启动机器<br />
5.删除oracle安装的目录和 C:\Program Files 目录下的 oracle 文件夹<br />
<br />
<br />
(至于 环境变量下的classpath和path 没必要删除)<br />
<img src ="http://www.blogjava.net/Crying/aggbug/195594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2008-04-24 15:22 <a href="http://www.blogjava.net/Crying/articles/195594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日期问题</title><link>http://www.blogjava.net/Crying/articles/153985.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 18 Oct 2007 11:25:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/153985.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/153985.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/153985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/153985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/153985.html</trackback:ping><description><![CDATA[<p>public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;AddStudentForm addStudentForm = (AddStudentForm) form;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;PersonDAO personDAO = new PersonDAO();<br />
&nbsp;&nbsp;Student student = new Student();<br />
&nbsp;&nbsp;String birth = addStudentForm.getBirthdayYear() + "-"+ addStudentForm.getBirthdayMonth() +<br />
&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;addStudentForm.getBirhthdayDay();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;student.setUsername(addStudentForm.getUsername());<br />
&nbsp;&nbsp;student.setPassword(addStudentForm.getPassword());<br />
&nbsp;&nbsp;student.setSex(addStudentForm.getSex());</p>
<p>&nbsp;&nbsp;try {<br />
&nbsp;<span style="color: red">&nbsp;&nbsp;SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");//固定的格式<br />
&nbsp;&nbsp; Date date = sd.parse(birth);//将字符转化为DATE类型<br />
&nbsp;&nbsp;&nbsp;student.setBirthday(date);<br />
</span>&nbsp;&nbsp;} catch (ParseException e) {</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println("插入失败插入失败插入失败插入失败插入失败");<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;student.setGrade(addStudentForm.getGragde());<br />
&nbsp;&nbsp;personDAO.insertStudentOrTeacher(student);<br />
&nbsp;&nbsp;return mapping.findForward("ok");<br />
&nbsp;}<br />
<br />
<br />
<br />
/*************************************************************************/<br />
<br />
<br />
<br />
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />
&nbsp;&nbsp;&nbsp;&nbsp; Date date=new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String toLocaleString = date.toLocaleString();<br />
&nbsp;article.setSavetime(sd.parse(toLocaleString));<br />
<br />
<br />
/*************************************************<br />
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br />
&nbsp;&nbsp;&nbsp;&nbsp; Date date=new Date();<br />
String dd=sd.<strong>format</strong>(date);<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/Crying/aggbug/153985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-10-18 19:25 <a href="http://www.blogjava.net/Crying/articles/153985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP调用SQL server 2000存储过程</title><link>http://www.blogjava.net/Crying/articles/153979.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 18 Oct 2007 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/153979.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/153979.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/153979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/153979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/153979.html</trackback:ping><description><![CDATA[1.新建表： <br />
<br />
<br />
CREATE TABLE [mytest] (<br />
[id] [int] NOT NULL ,<br />
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br />
[phone] [varchar] (13) COLLATE Chinese_PRC_CI_AS NULL ,<br />
[addr] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL <br />
) ON [PRIMARY]<br />
GO<br />
<br />
<br />
2.新建存储过程： <br />
<br />
<br />
create procedure get_info @name varchar(50),@phone varchar(13),@addr varchar(50)<br />
as <br />
select * <br />
from mytest <br />
go<br />
<br />
<br />
3.JSP代码： <br />
<br />
<br />
&lt;%@ page language="java" pageEncoding="UTF-8" import="java.sql.*,tools.Database"%&gt;<br />
<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" divfix="bean" %&gt;<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-html" divfix="html" %&gt;<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" divfix="logic" %&gt;<br />
&lt;%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" divfix="tiles" %&gt;<br />
<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html:html locale="true"&gt;<br />
&lt;head&gt;<br />
&lt;html:base /&gt;<br />
<br />
&lt;title&gt;proc_test.jsp&lt;/title&gt;<br />
<br />
&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />
&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />
&lt;meta http-equiv="expires" content="0"&gt; <br />
&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />
&lt;meta http-equiv="description" content="This is my page"&gt;<br />
&lt;/head&gt;<br />
<br />
&lt;body&gt;<br />
This is a test for procedure. &lt;br&gt;<br />
&lt;% <br />
String username="sa";<br />
String password = "123456";<br />
String url = "jdbc:microsoft:sqlserver://192.168.1.112:1433;DatabaseName=test";<br />
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();<br />
Connection conn = DriverManager.getConnection(url, username, password);<br />
<br />
String sql = "execute get_info";<br />
//创建一个CallableStatement 对象来调用数据库存储过程<br />
//CallableStatement comm = conn.divpareCall(sql); <br />
Statement stmt = conn.createStatement();<br />
<br />
ResultSet res = stmt.executeQuery(sql);<br />
while(res.next())...{<br />
%&gt;<br />
&lt;table&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;%=res.getString("id")%&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;%=res.getString("name")%&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;%=res.getString("phone")%&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;%=res.getString("addr")%&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;%}<br />
res.close();<br />
stmt.close();<br />
conn.close();<br />
%&gt;<br />
&lt;/body&gt;<br />
&lt;/html:html&gt;<br />
<br />
<br />
<br />
4.执行结果： <br />
<br />
This is a test for procedure. <br />
<br />
1 cc 1234 cs <br />
<br />
2 dd 4567 bj <br />
<br />
3 ee 1245 ca<br />
<img src ="http://www.blogjava.net/Crying/aggbug/153979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-10-18 19:02 <a href="http://www.blogjava.net/Crying/articles/153979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中的外连接</title><link>http://www.blogjava.net/Crying/articles/148832.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 27 Sep 2007 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/148832.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/148832.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/148832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/148832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/148832.html</trackback:ping><description><![CDATA[关联的两张表，当数据少的那张要在数据多的那张表字段里，显示为NULL时，就需要使用外连接。
<div id="pip">&nbsp;</div>
<div class="guanggao">
<p>　　在讲外连接之前，先举例介绍内连接，也就是一般的相等连接。</p>
<p>　　select * from a, b where a.id = b.id;</p>
<p>　　对于外连接，Oracle中可以使用&#8220;(+)&#8221;来表示，9i可以使用LEFT/RIGHT/FULL OUTER JOIN，下面将配合实例一一介绍。</p>
<p>　　1. LEFT OUTER JOIN:左外关联</p>
<p>　　SELECT e.last_name, e.department_id, d.department_name</p>
<p>　　FROM employees e</p>
<p>　　LEFT OUTER JOIN departments d</p>
<p>　　ON (e.department_id = d.department_id);</p>
<p>　　等价于</p>
<p>　　SELECT e.last_name, e.department_id, d.department_name</p>
<p>　　FROM employees e, departments d</p>
<p>　　WHERE e.department_id=d.department_id(+);</p>
<p>　　结果为:所有员工及对应部门的记录，包括没有对应部门编号department_id的员工记录。</p>
<p>　　2. RIGHT OUTER JOIN:右外关联</p>
<p>　　SELECT e.last_name, e.department_id, d.department_name</p>
<p>　　FROM employees e</p>
<p>　　RIGHT OUTER JOIN departments d</p>
<p>　　ON (e.department_id = d.department_id);</p>
<p>　　等价于</p>
<p>　　SELECT e.last_name, e.department_id, d.department_name</p>
<p>　　FROM employees e, departments d</p>
<p>　　WHERE e.department_id(+)=d.department_id;</p>
<p>　　结果为:所有员工及对应部门的记录，包括没有任何员工的部门记录。</p>
<p>　　3. FULL OUTER JOIN:全外关联</p>
<p>　　SELECT e.last_name, e.department_id, d.department_name</p>
<p>　　FROM employees e</p>
<p>　　FULL OUTER JOIN departments d</p>
<p>　　ON (e.department_id = d.department_id);</p>
<p>　　结果为:所有员工及对应部门的记录，包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。</p>
</div>
<img src ="http://www.blogjava.net/Crying/aggbug/148832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-27 19:05 <a href="http://www.blogjava.net/Crying/articles/148832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle优化sql语句</title><link>http://www.blogjava.net/Crying/articles/148831.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 27 Sep 2007 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/148831.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/148831.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/148831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/148831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/148831.html</trackback:ping><description><![CDATA[<p>36.&nbsp;用UNION替换OR&nbsp;(适用于索引列)&nbsp;<br />
<br />
通常情况下,&nbsp;用UNION替换WHERE子句中的OR将会起到较好的效果.&nbsp;对索引列使用OR将造成全表扫描.&nbsp;注意,&nbsp;以上规则只针对多个索引列有效.&nbsp;如果有column没有被索引,&nbsp;查询效率可能会因为你没有选择OR而降低.&nbsp;<br />
<br />
在下面的例子中,&nbsp;LOC_ID&nbsp;和REGION上都建有索引.&nbsp;<br />
<br />
高效:&nbsp;<br />
<br />
SELECT&nbsp;LOC_ID&nbsp;,&nbsp;LOC_DESC&nbsp;,&nbsp;REGION&nbsp;<br />
<br />
FROM&nbsp;LOCATION&nbsp;<br />
<br />
WHERE&nbsp;LOC_ID&nbsp;=&nbsp;10&nbsp;<br />
<br />
UNION&nbsp;<br />
<br />
SELECT&nbsp;LOC_ID&nbsp;,&nbsp;LOC_DESC&nbsp;,&nbsp;REGION&nbsp;<br />
<br />
FROM&nbsp;LOCATION&nbsp;<br />
<br />
WHERE&nbsp;REGION&nbsp;=&nbsp;&#8220;MELBOURNE&#8221;&nbsp;<br />
<br />
<br />
低效:&nbsp;<br />
<br />
SELECT&nbsp;LOC_ID&nbsp;,&nbsp;LOC_DESC&nbsp;,&nbsp;REGION&nbsp;<br />
<br />
FROM&nbsp;LOCATION&nbsp;<br />
<br />
WHERE&nbsp;LOC_ID&nbsp;=&nbsp;10&nbsp;OR&nbsp;REGION&nbsp;=&nbsp;&#8220;MELBOURNE&#8221;&nbsp;<br />
<br />
<br />
如果你坚持要用OR,&nbsp;那就需要返回记录最少的索引列写在最前面.&nbsp;<br />
<br />
<br />
注意:&nbsp;<br />
<br />
<br />
WHERE&nbsp;KEY1&nbsp;=&nbsp;10&nbsp;(返回最少记录)&nbsp;<br />
<br />
OR&nbsp;KEY2&nbsp;=&nbsp;20&nbsp;(返回最多记录)&nbsp;<br />
<br />
<br />
ORACLE&nbsp;内部将以上转换为&nbsp;<br />
<br />
WHERE&nbsp;KEY1&nbsp;=&nbsp;10&nbsp;AND&nbsp;<br />
<br />
((NOT&nbsp;KEY1&nbsp;=&nbsp;10)&nbsp;AND&nbsp;KEY2&nbsp;=&nbsp;20)&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/Crying/aggbug/148831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-27 19:04 <a href="http://www.blogjava.net/Crying/articles/148831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql面试题及答案</title><link>http://www.blogjava.net/Crying/articles/148443.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Wed, 26 Sep 2007 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/148443.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/148443.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/148443.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/148443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/148443.html</trackback:ping><description><![CDATA[<p>1.磁盘柜上有14块73G的磁盘， 数据库为200G 大小包括日志文件，如何设置磁盘（要说明这14磁盘是怎么用的）？<br />
2.有两服务器群集，分别为node1和node2 现在要打win200系统补丁，打完后，要重新启动，如何打补丁，不能影响用户使用（要用群集的术语详细说明）。<br />
3.有一个A 数据库，分别复制到B和C&nbsp; B 要求 每次数据更新 也同时更新，C 每天更新一次就行，如何制定复制策略!<br />
4.有一个order 表，有90个字段，20个索引，15个复合索引，其中有3个索引字段超过10个，如何进行优化<br />
5.有一个数据库200G大小，每天增加50M 允许用户随时访问，制定备份策略（详细说明）。<br />
6.管理50台数据库，日常工作是检查数据库作业是否完成，你该如何完成这项检查工作？<br />
7.自定义函数和存储过程的区别是什么，什么情况下只能用自定义函数，什么情况下只能用存储过程<br />
8.SQL 2005 的新特性是什么 ？&nbsp; 与oracle 有什么区别？<br />
9.DBA 的品质应该有哪些，你有哪些， 有什么欠缺的？<br />
10。如果想配置SQL Mail 应该在服务器安装哪些<a onclick="tagshow(event, '%C8%ED%BC%FE');return false;" href="javascript:;"><u><strong>软件</strong></u></a>！<br />
<font color="#ff0000">参考答案:</font></p>
<p>1.磁盘柜上有14块73G的磁盘， 数据库为200G 大小包括日志文件，如何设置磁盘（要说明这14磁盘是怎么用的）？</p>
<p>这个问题应该是考察硬件知识和数据库物理部署。</p>
<p>首先需要知道这些磁盘是否要用于存放数据库备份文件和数据库性能（读/写）要求。来决定raid的级别。<br />
1）、如果偏重于性能考虑，而且不用存放数据库备份文件的话，考虑使用raid0+1，这样可使用的磁盘容量为：14*73*50%=511G。<br />
2）、如果读/写性能要求不高，而且还比较抠门的话，可以考虑raid5，这样可使用的磁盘容量为：13*73=949G。</p>
<p>至于如何使用应该是说数据库物理文件的部署。注意说出将tempdb,data file,log file分开存放以减少I/O竞争即可。其实现在的条带化磁盘一般都会自动将文件分存，人为的分布已经越来越不重要了。</p>
<p>2.有两服务器群集，分别为node1和node2 现在要打win200系统补丁，打完后，要重新启动，如何打补丁，不能影响用户使用（要用群集的术语详细说明）。</p>
<p>这个具体操作有点忘了。大致是：首先看哪个节点正在使用，通过节点IP（私有）访问另一个空闲节点，为其打上补丁，然后在群集管理器中停止该节点（也可以用命令行方式），重新启动。等到启动完毕，将切换使用节点，为另一个节点打补丁。然后重新启动。</p>
<p>3.有一个A 数据库，分别复制到B和C&nbsp; B 要求 每次数据更新 也同时更新，C 每天更新一次就行，如何制定复制策略!</p>
<p>这个应该考察的是复制知识。</p>
<p>a-&gt;b<br />
1）、如果使用SQL Server复制功能，那么让a-&gt;b使用事务性复制方式（同步复制）。<br />
2）、如果表不多，也可以自己写触发器，利用linkserver+distribute transaction。</p>
<p>a-&gt;c<br />
1）、如果使用SQL Server复制功能，那么让a-&gt;b使用快照复制方式，在某一时间点进行一次性复制。<br />
2）、也可以自己写bat，将a备份后，通过ftp传输备份介质，恢复c。（比较麻烦，不推荐）</p>
<p><br />
4.有一个order 表，有90个字段，20个索引，15个复合索引，其中有3个索引字段超过10个，如何进行优化</p>
<p>这个问题问的比较没水平。你不详细说明这个表的使用方式（读写类的，还是几乎是静态表），就问人家怎么优化？！！还不如问问索引的分布访问原理更好。</p>
<p>看得出他就想让你说：那三个索引超过10个，B树遍例效率很低，适当减少字段数目。如果是SQL2005，可以将选择性不好的字段放在&#8220;索引附加字段&#8221;中，以保证索引覆盖。而且SQL Server由于有锁升级的毛病，可以考虑拆开表。</p>
<p><br />
5.有一个数据库200G大小，每天增加50M 允许用户随时访问，制定备份策略（详细说明）。</p>
<p>这种情况可以采用增量备份方式。每周日做一次全备份，周一到周六作增量备份（由于数据量较少，可以考虑每30分钟增量备份一次）。这样可以尽量减少性能消耗，而且如果transaction log丢失的情况下，可以保证最多丢失30分钟数据。</p>
<p><br />
6.管理50台数据库，日常工作是检查数据库作业是否完成，你该如何完成这项检查工作？</p>
<p>这个比较简单。在每台机器上建立linkserver，然后在DBA管理服务器上做个分布式视图，每次查询该视图，各个机器上的作业情况一目了然。分布式视图写法：</p>
<p>create view vw_job<br />
as</p>
<p>select '机器一' as MName,* from linkserver1..sysjobactivity<br />
union all<br />
select '机器二' as MName,* from linkserver2..sysjobactivity<br />
union all<br />
select '机器三' as MName,* from linkserver3..sysjobactivity</p>
<p>7.自定义函数和存储过程的区别是什么，什么情况下只能用自定义函数，什么情况下只能用存储过程</p>
<p>这个应该是考察存储过程编写经验。一般自定义函数主要用于其他sql中的调用，如：</p>
<p>select yourfunc(...) from table</p>
<p>这种情况下，一般只能通过函数实现。</p>
<p>存储过程的功能要远远强于函数，例如动态执行sql（sp_executesql）的使用和一些特殊的功能，自定义函数中是不支持的，只能用存储过程实现。</p>
<p><br />
8.SQL 2005 的新特性是什么 ？&nbsp; 与oracle 有什么区别？</p>
<p>SQL 2005 的新特性一般都是和Oracle学的。</p>
<p>下面是当时被leimin逼着写的，你可以做个参考：</p>
<p>一、数据库设计方面<br />
1、字段类型。<br />
varchar(max)\nvarchar(max)类型的引入大大的提高了<a onclick="tagshow(event, '%B1%E0%B3%CC');return false;" href="javascript:;"><u><strong>编程</strong></u></a>的效率，可以使用字符串函数对CLOB类型进行操作，这是一个亮点。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据，是否会出现大规模的碎片？是否碎片会引发效率问题？这都是需要进一步探讨的东西。</p>
<p>varbinary(max)代替image也让SQL Server的字段类型更加简洁统一。</p>
<p>XML字段类型更好的解决了XML数据的操作。XQuery确实不错，但是个人对其没好感。（CSDN的开发者应该是相当的熟了！）</p>
<p>2、外键的级联更能扩展<br />
可能大部分的同行在设计OLTP系统的时候都不愿意建立外键，都是通过程序来控制父子数据的完整性。但是再开发调试阶段和OLAP环境中，外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性，能够提供能好的级联设置。</p>
<p>3、索引附加字段<br />
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高，但是相对映射到数据表中效率还是提高了很多。我做过试验，在我的实验环境中会比映射到表中提高30%左右的效率。</p>
<p>4、计算字段的持久化<br />
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已，性能方面提高不多。但是SQL2005提供了计算字段的持久化，这就提高了查询的性能，但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。</p>
<p>5、分区表<br />
分区表是个亮点！从分区表也能看出微软要做大作强SQL Server的信心。资料很多，这里不详细说。但是重点了解的是：现在的SQL Server2005的表，都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。<br />
但是需要注意的一点，也是我使用过程中发现的一个问题。在建立function-&gt;schema-&gt;table后，如果在现有的分区表上建立没有显式声明的聚集索引时，分区表会自动变为非分区表。这一点很让我纳闷。如果你觉得我的非分区索引无法对起子分区，<br />
你可以提醒我一下呀！没有任何的提醒，直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。</p>
<p>分区表效率问题肯定是大家关心的问题。在我的试验中，如果按照分区字段进行的查询（过滤）效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询，效率会低于未分区表的相同语句。但是随着数据量的增大，这种成本差距会逐渐减小，趋于相等。（500万数量级只相差10%左右）</p>
<p>6、CLR类型</p>
<p>微软对CLR作了大篇幅的宣传，这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜，感觉对象数据库的一些概念可以实现了。但是作了些试验，发现使用CLR的存储过程或函数在达到一定的阀值的时候，系统性能会呈指数级下滑！这是非常危险的！只使用几个可能没有问题，当一旦大规模使用会造成严重的系统性能问题！</p>
<p>其实可以做一下类比，Oracle等数据库产品老早就支持了java编程，而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程？！连Oracle自己的应用都不用为什么？！还不是性能有问题！否则面向对象的数据库早就实现了！</p>
<p>建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法，并且用到了大量的指针和高级数据模型。或者是要和操作系统进行Socket通讯的场景。否则建议慎重！</p>
<p>7、索引视图</p>
<p>索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。</p>
<p>8、语句和事务快照</p>
<p>语句级快照和事务级快照终于为SQL Server的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照，如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时，会杀人的！</p>
<p>9、数据库快照</p>
<p>原理很简单，对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜！</p>
<p>10、Mirror<br />
Mirror可以算是SQL Server的Data guard了。但是能不能被大伙用起来就不知道了。</p>
<p>二、开发方面</p>
<p>1、Ranking函数集<br />
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史，而且SQL Server2005的row_number比Oracle的更先进。因为它把Order by集成到了一起，不用像Oracle那样还要用子查询进行封装。但是大家注意一点。如下面的例子：</p>
<p>select ROW_NUMBER() OVER (order by aa)<br />
from tbl<br />
order by bb</p>
<p>会先执行aa的排序，然后再进行bb的排序。</p>
<p>可能有的朋友会抱怨集成的order by，其实如果使用ranking函数,Order by是少不了的。如果担心Order by会影响效率，可以为order by的字段建立聚集索引，查询计划会忽略order by 操作（因为本来就是排序的嘛）。</p>
<p>2、top<br />
可以动态传入参数，省却了动态SQL的拼写。</p>
<p>3、Apply<br />
对递归类的树遍历很有帮助。</p>
<p>4、CTE<br />
个人感觉这个真是太棒了！阅读清晰，非常有时代感。</p>
<p>5、try/catch<br />
代替了原来VB式的错误判断。比Oracle高级不少。</p>
<p>6、pivot/unpivot<br />
个人感觉没有case直观。而且默认的第三字段（还可能更多）作为group by字段很容易造成新手的错误。</p>
<p>&nbsp;</p>
<p>三、DBA管理方面</p>
<p>1、数据库级触发器<br />
记得在最开始使用2k的时候就要用到这个功能，可惜2k没有，现在有了作解决方案的朋友会很高兴吧。</p>
<p>2、多加的系统视图和实时系统信息</p>
<p>这些东西对DBA挑优非常有帮助，但是感觉粒度还是不太细。</p>
<p>3、优化器的改进<br />
一直以来个人感觉SQL Server的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。（有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。）<br />
论坛例子：<br />
<a href="http://community.csdn.net/Expert/topic/4543/4543718.xml?temp=.405987">http://community.csdn.net/Expert/topic/4543/4543718.xml?temp=.405987</a></p>
<p>4、profiler的新事件观察<br />
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。</p>
<p>5、sqlcmd</p>
<p>习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQL Server Management Studio的朋友使用。</p>
<p>四、遗憾</p>
<p>1、登陆的控制<br />
始终遗憾SQL Server的登陆无法分配CPU/内存占用等指标数。如果你的SQL Server给别人分配了一个只可以读几个表的权限，而这个家伙疯狂的死循环进行连接查询，会给你的系统带来很大的负担。而SQL Server如果能像Oracle一样可以为登陆分配如：5%的cpu，10%的内存。就可以解决这个漏洞。</p>
<p>2、数据库物理框架没有变动<br />
undo和redo都放在数据库得transaction中，个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库，可能能在一定程度上避免I/O效率问题。但是同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中，就能感觉到目前架构的尴尬。</p>
<p>3、还是没有逻辑备份<br />
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。</p>
<p>4、SSIS(DTS)太复杂了</p>
<p>SQL Server的异构移植功能个人感觉最好了。（如果对比过SQL Server的链接服务器和Oracle的透明网关的朋友会发现SQL Server的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。）<br />
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多，但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了，往往会有很多用户不会用了。</p>
<p><br />
与oracle 有什么区别？</p>
<p>这个问题相当变态！不同点我能给他讲一天！首先名字就不一样嘛！！ ：）</p>
<p><br />
9.DBA 的品质应该有哪些，你有哪些， 有什么欠缺的？</p>
<p>略</p>
<p>10。如果想配置SQL Mail 应该在服务器安装哪些软件！</p>
<p>需要哪些软件？安个outlook express就可以了。sql server提供接口存储过程，非常简单。</p>
<img src ="http://www.blogjava.net/Crying/aggbug/148443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-26 21:24 <a href="http://www.blogjava.net/Crying/articles/148443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB开发中文处理问题</title><link>http://www.blogjava.net/Crying/articles/147394.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 22 Sep 2007 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/147394.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/147394.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/147394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/147394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/147394.html</trackback:ping><description><![CDATA[<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;&nbsp;&nbsp; 自己总结的（建议使用方法1）<br />
方法一：<br />
****************</p>
<p>写个过滤器类：<br />
import java.io.IOException;<br />
import javax.servlet.Filter;<br />
import javax.servlet.FilterChain;<br />
import javax.servlet.FilterConfig;<br />
import javax.servlet.ServletException;<br />
import javax.servlet.ServletRequest;<br />
import javax.servlet.ServletResponse;<br />
public class Filter1 implements Filter {<br />
&nbsp;private FilterConfig filterConfig=null;<br />
&nbsp;&nbsp;&nbsp; private String encoding=null;<br />
&nbsp;&nbsp;&nbsp; public void init(FilterConfig filterConfig) throws ServletException {<br />
&nbsp;&nbsp;// TODO 自动生成方法存根<br />
&nbsp;&nbsp; this.filterConfig=filterConfig;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.encoding=this.filterConfig.getInitParameter("encoding");<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest request, ServletResponse response,<br />
&nbsp;&nbsp;&nbsp;FilterChain chain) throws IOException, ServletException {<br />
&nbsp;&nbsp;// TODO 自动生成方法存根&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(encoding!=null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setCharacterEncoding(encoding);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);<br />
}<br />
&nbsp;public void destroy() {<br />
&nbsp;&nbsp;// TODO 自动生成方法存根<br />
&nbsp;&nbsp;this.encoding=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.filterConfig=null;<br />
&nbsp;}<br />
}<br />
再在项目的web.xml中配置如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp; &lt;filter-name&gt;filter1&lt;/filter-name&gt;<br />
&nbsp;&nbsp; &lt;filter-class&gt;com.tools.Filter1&lt;/filter-class&gt;<br />
&nbsp; &nbsp;&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&nbsp; &nbsp;&nbsp;&lt;/init-param&gt;<br />
&nbsp; &lt;/filter&gt;<br />
&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp; &lt;filter-name&gt;filter1&lt;/filter-name&gt;<br />
&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp; &lt;/filter-mapping&gt;<br />
注意：所有的JSP页面的类型均为&lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br />
//////////////////////////////////////////////////////////////////////////////</p>
<p>&nbsp;</p>
<p><br />
方法二：<br />
/////////////////////////////////////////////////////////////////////////<br />
在struts中的可以重写ActionServlet类的process方法<br />
package tools;//包<br />
import java.io.IOException;<br />
import javax.servlet.ServletException;<br />
import javax.servlet.http.*;<br />
import org.apache.struts.action.ActionServlet;</p>
<p>public class MyActionServlet extends ActionServlet{</p>
<p>&nbsp;<br />
&nbsp;private static final long serialVersionUID = 6864646927139403188L;<br />
&nbsp;&nbsp; public MyActionServlet()<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp;protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {<br />
&nbsp;&nbsp;request.setCharacterEncoding("UTF-8");<br />
&nbsp;&nbsp;super.process(request, response);<br />
&nbsp;}</p>
<p>}<br />
再在项目的web.xml中<br />
&nbsp;&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;tools.MyActionServlet&lt;/servlet-class&gt;/////////////根据自己的的MyActionSerclet所在的位置<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;detail&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;&nbsp; <br />
&lt;/web-app&gt;</p>
<p><br />
注意：所有的JSP页面的类型均为&lt;%@ page contentType="text/html; charset=UTF-8"%&gt;<br />
1中方法=====================================================<br />
要是数据库是MYSQL还要在applicationContext.xml配置中加<br />
&lt;property name="url" value="jdbc:mysql://localhost:3306/j2ee?useUnicode=true&amp;amp;characterEncoding=UTF-8"&gt;&lt;/property&gt;<br />
<br />
</p>
<p>2中方法.****************************************************<br />
MYSQL 中的hibernate.cfg.xml在&lt;session-factory&gt;和&lt;/session-factory&gt;之间加入这么一段： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.useUnicode"&gt;true&lt;/property&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="connection.characterEncoding"&gt;UTF-8&lt;/property&gt;</p>
<p>这样一来，是可以解决乱码问题。<br />
</p>
<p><br />
&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/Crying/aggbug/147394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-22 13:45 <a href="http://www.blogjava.net/Crying/articles/147394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用数据库JDBC连接写法  </title><link>http://www.blogjava.net/Crying/articles/147392.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 22 Sep 2007 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/147392.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/147392.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/147392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/147392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/147392.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>///几个重要的语句<br />
String insertSql="insert into Product(name,price) values('"+name+"',"+price+")";//price 为整型<br />
String updateSql="update Product set&nbsp; PName='"+name+"', PPrice="+price+" where PID='"+id+"'";<br />
String sql="select * from Product where PName like '%"+key+"%'";<br />
String sql = "delete&nbsp; t_user&nbsp; where userid="+userid;</p>
<p>JNDI方法一<br />
/////////////////////////////////////////<br />
记得导入6个.JAR包并在tomcat中的lib文件下也要导入这6个.JAR包<br />
工具类<br />
</p>
<p>package util;</p>
<p>import java.sql.Connection;<br />
import java.sql.PreparedStatement;<br />
import java.sql.ResultSet;<br />
import java.sql.ResultSetMetaData;<br />
import java.sql.SQLException;<br />
import java.sql.Statement;<br />
import java.util.ArrayList;<br />
import javax.naming.Context;<br />
import javax.naming.InitialContext;<br />
import javax.sql.DataSource;</p>
<p>import com.Admin;</p>
<p>/**<br />
&nbsp;* @author wsq<br />
&nbsp;* @version 1.0 07/10/20<br />
&nbsp;*/<br />
public class DBConnection {</p>
<p>&nbsp;private static Connection con = null;</p>
<p>&nbsp;private static Statement stmt = null;</p>
<p>&nbsp;private static ResultSet rs = null;</p>
<p>&nbsp;private static ArrayList&lt;String[]&gt; ArrayRs = null;</p>
<p>&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 创建数据源<br />
&nbsp; * <br />
&nbsp; * @return Connection<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public static synchronized Connection getConnection() throws Exception {<br />
&nbsp;&nbsp;Context initCtx = new InitialContext(); // 从Context中lookup数据源。<br />
&nbsp;&nbsp;DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/data"); // jdbc/data为下面Resource的name属性<br />
&nbsp;&nbsp;return ds.getConnection();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 执行数据查询操作<br />
&nbsp; * <br />
&nbsp; * @param sql<br />
&nbsp; * @return ResultSet<br />
&nbsp; */<br />
&nbsp;public static ArrayList executeQuery(String sql) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;rs = stmt.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;ResultSetMetaData rsmd = rs.getMetaData(); // 获取此 ResultSet 对象的列的编号、类型和属性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;int numberOfColumns = rsmd.getColumnCount();// 返回此 ResultSetMetaData对象中的列数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;// 判断是否为空<br />
&nbsp;&nbsp;&nbsp;if (!ArrayRs.isEmpty()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;ArrayRs.clear();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp; * 将每条记录写入数组 将数组放在ArrayList里<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;while (rs.next()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String[] strArrayTemp = new String[numberOfColumns];<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; numberOfColumns; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rs.getObject(i + 1) == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strArrayTemp[i] = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strArrayTemp[i] = rs.getObject(i + 1).toString();// 以<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Java<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;// Object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp; // ResultSet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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; // 第一个列是1,第二个列是2,....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" test value&nbsp;&nbsp;&nbsp; " + strArrayTemp[i]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;ArrayRs.add(strArrayTemp);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("executeQuery successfully!");</p>
<p>&nbsp;&nbsp;&nbsp;return (ArrayList) ArrayRs.clone();<br />
&nbsp;&nbsp;} catch (SQLException ex) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("query error:" + ex.getMessage());<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;DBConnection.close();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return ArrayRs;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * @param executeInsert插入数据方法<br />
&nbsp; * @return 插入条数是否成功(boolean)<br />
&nbsp; */<br />
&nbsp;public static boolean executeInsert(String strSql) throws SQLException {<br />
&nbsp;&nbsp;rs = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;con = DBConnection.getConnection();<br />
&nbsp;&nbsp;&nbsp;stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;con.setAutoCommit(true);<br />
&nbsp;&nbsp;&nbsp;int i = stmt.executeUpdate(strSql);</p>
<p>&nbsp;&nbsp;&nbsp;if (i == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return (true);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("Insert error:" + e.getMessage());<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;DBConnection.close();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return (false);<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 执行数据更新操作<br />
&nbsp; * <br />
&nbsp; * @param sql<br />
&nbsp; * @return 更新是否成功 (int)<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public static int executeUpdate(String sql) throws Exception {<br />
&nbsp;&nbsp;int result = 0;<br />
&nbsp;&nbsp;con = DBConnection.getConnection();<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;result = stmt.executeUpdate(sql);// 返回影响的行数<br />
&nbsp;&nbsp;&nbsp;con.commit(); // 提交</p>
<p>&nbsp;&nbsp;} catch (SQLException ex) {<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.rollback();// 回滚<br />
&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("update error:" + e.getMessage());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.err.println(ex.getMessage());</p>
<p>&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;DBConnection.close();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * @param executeDelete删除数据方法<br />
&nbsp; * @return 删除数据数(int)<br />
&nbsp; */<br />
&nbsp;public static int executeDelete(String strSql) throws SQLException {<br />
&nbsp;&nbsp;rs = null;<br />
&nbsp;&nbsp;int j = 0;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;con = DBConnection.getConnection();<br />
&nbsp;&nbsp;&nbsp;stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;con.setAutoCommit(false);<br />
&nbsp;&nbsp;&nbsp;j = stmt.executeUpdate(strSql);</p>
<p>&nbsp;&nbsp;&nbsp;if (j &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.commit();<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.rollback();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("Delete error:" + e.getMessage());<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;&nbsp;DBConnection.close();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return j;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 关闭连接，将连接送回连接池<br />
&nbsp; * <br />
&nbsp; */</p>
<p>&nbsp;public static void close() {<br />
&nbsp;&nbsp;if (con != null) {<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;con = null;<br />
&nbsp;&nbsp;&nbsp;} catch (SQLException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(ex.getMessage());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>在项目的...\WebRoot\META-INF下创建个context.xml或者在tomcat中的server.xml写<br />
&nbsp; &lt;Context path="/jndi" docBase="jndi" debug="0"&nbsp; reloadable="true" crossContext="true"&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &lt;Resource name="jdbc/data"&nbsp; auth="Container" type="javax.sql.DataSource"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbs"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="wsq" password="123"&nbsp;&nbsp; maxIdle="20" maxWait="5000"&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="100" removeAbandoned="true" <br />
&nbsp;&nbsp;&nbsp; removeAbandonedTimeout="60" logAbandoned="true"/&gt;<br />
&lt;/Context&gt;</p>
<p>&nbsp;</p>
<p>方法二<br />
Struts（1.2） <br />
/////////////////////////<br />
连接池在struts-cionfig.xml中的配置（sql2000）<br />
&nbsp;&lt;data-sources&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;data-source type="org.apache.commons.dbcp.BasicDataSource" key="data'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set-property property="driverClassName"value="com.microsoft.jdbc.sqlserver.SQLServerDriver" /&gt;//记得要Name<br />
&nbsp;&lt;set-property property="url"value="jdbc:microsoft:sqlserver://localhost:1433;databasename=dbs" /&gt;<br />
&nbsp;&lt;set-property property="username" value="wsq" /&gt;//记得要name<br />
&nbsp;&lt;set-property property="password" value="123" /&gt;<br />
&nbsp;&lt;set-property property="maxActive" value="10" /&gt;<br />
&nbsp;&lt;set-property property="maxWait" value="5000" /&gt;<br />
&nbsp;&lt;set-property property="defaultAutoCommit" value="false" /&gt;//记得在false的情况（插入和更新时要con.commit）<br />
&nbsp;&lt;set-property property="defaultReadOnly" value="false" /&gt;<br />
&nbsp;&nbsp; &lt;/data-source&gt;<br />
&lt;/data-sources&gt;<br />
/////////////////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 辅助类<br />
package tools;</p>
<p>import java.sql.Connection;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
import java.sql.Statement;</p>
<p>import javax.sql.DataSource;</p>
<p>public class DBUtil {<br />
&nbsp;Connection con=null;<br />
&nbsp;ResultSet rs = null;<br />
&nbsp;<br />
&nbsp;public DBUtil(DataSource dataSource)<br />
&nbsp;{ <br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;con=dataSource.getConnection();<br />
&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
////在数据库中执行查询操作<br />
&nbsp;public ResultSet executeQuery(String sql) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;rs = stmt.executeQuery(sql);<br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;catch(SQLException ex) { <br />
&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return rs;<br />
&nbsp;} <br />
//&nbsp;在数据库中执行数据更新的方法<br />
&nbsp;public int executeUpdate(String sql) {<br />
&nbsp;&nbsp;int result = 0;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Statement stmt = con.createStatement();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;//返回影响的行数<br />
&nbsp;&nbsp;&nbsp;result = stmt.executeUpdate(sql);<br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;catch(SQLException ex) { <br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.rollback();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //回滚<br />
&nbsp;&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO 自动生成 catch 块<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.err.println(ex.getMessage());<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}<br />
//&nbsp;关闭数据源<br />
&nbsp;public void close(){<br />
&nbsp;&nbsp;if(con!=null){<br />
&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;con = null;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}catch(SQLException ex) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(ex.getMessage());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}&nbsp;<br />
&nbsp;}</p>
<p>}<br />
//////////////////////////////////////////////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （不利用辅助类时）<br />
在xxxAction.java中的execute()方法中<br />
&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataSource dataSource=getDataSource(request,"data");//得到数据源<br />
&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; //得到数据源ServletContext context=servlet.getServletContext();<br />
&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; // DataSource dataSource=(DataSource) context.getAttribute("data");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connetion con=dataSource.getConnection(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pstm=con.prepareStatement("insert into userone (name,password) values(?,?)");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstm.setString(1,name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstm.setString(2,password);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstm.executUpadate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.commit();/////记得写上(在插入或更新时一定要记得加上)正确是提交事务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.rollback();//失败时回滚<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;pstm.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;con.close();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
方法三（最原始的）直接连<br />
**********************<br />
1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar/<br />
Class.forName( "org.gjt.mm.mysql.Driver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd );</p>
<p>2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar/<br />
Class.forName( "org.postgresql.Driver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd );</p>
<p>3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip<br />
Class.forName( "oracle.jdbc.driver.OracleDriver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );</p>
<p>4. Sybase(http://jtds.sourceforge.net)jconn2.jar/<br />
Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );<br />
//(Default-Username/Password: "dba"/"sql")</p>
<p>5. Microsoft SQLServer(http://jtds.sourceforge.net/)<br />
Class.forName( "net.sourceforge.jtds.jdbc.Driver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );</p>
<p>6. Microsoft SQLServer(http://www.microsoft.com/)<br />
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );<br />
cn = DriverManager.getConnection( <br />
"jdbc:microsoft:sqlserver://localhost:1433;databaseName=dbs", sUsr, sPwd );</p>
<p>7. ODBC<br />
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );<br />
Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd <br />
);</p>
<p>&nbsp;</p>
<p>&nbsp;<br />
select @@version 是查看你的MSSQL版本&nbsp; 看补丁打没打<br />
///////////////////////////////////////////////////////////////////////////////////</p>
<p><br />
String insertSql="insert into Product values('"+id+"','"+name+"',"+price+")";<br />
String updateSql="update Product set&nbsp; PName='"+name+"', PPrice="+price+" where PID='"+id+"'";<br />
String sql="select * from Product where PName like '%"+key+"%'";<br />
String sql = "delete&nbsp; t_user&nbsp; where userid="+userid;</p>
<p><br />
////////////////////////////////////////////////////////<br />
&nbsp;</p>
<p>&nbsp;<br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/Crying/aggbug/147392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-22 13:40 <a href="http://www.blogjava.net/Crying/articles/147392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超简单的存储过程</title><link>http://www.blogjava.net/Crying/articles/146738.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Thu, 20 Sep 2007 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/146738.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/146738.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/146738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/146738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/146738.html</trackback:ping><description><![CDATA[简单的存储过程<br />
USE pubs<br />
IF EXISTS (SELECT name&nbsp; FROM sysobjects WHERE name='first_proc'&nbsp; AND type='P'&nbsp; ) <br />
DROP PROCEDURE first_proc<br />
GO<br />
CREATE PROCEDURE first_proc&nbsp; <br />
AS<br />
SELECT au_lname,title <br />
&nbsp;&nbsp;&nbsp; FROM authors AS a INNER JOIN titleauthor AS ta&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON a.au_id=ta.au_id INNER JOIN titles AS t<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON ta.title_id=t.title_id<br />
GO<br />
exec first_proc<br />
/**********************************************************************************/<br />
带输入参数<br />
USE pubs<br />
IF EXISTS (SELECT name&nbsp; FROM sysobjects WHERE name='first_proc'&nbsp; AND type='P'&nbsp; ) <br />
DROP PROCEDURE first_proc<br />
GO<br />
CREATE PROCEDURE first_proc&nbsp; <br />
&nbsp;&nbsp; @lastname varchar(40),@firstname varchar(20) <br />
AS<br />
SELECT au_lname, au_fname, title,pub_name <br />
&nbsp;&nbsp;&nbsp; FROM authors AS a INNER JOIN titleauthor AS ta&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON a.au_id=ta.au_id INNER JOIN titles AS t<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON ta.title_id=t.title_id INNER JOIN publishers p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON t.pub_id=p.pub_id<br />
&nbsp;&nbsp; WHERE au_lname=@lastname AND au_fname=@firstname<br />
GO<br />
exec first_proc 'White','hh' <br />
**********************************************************************************/<br />
带输入 和输出参数<br />
USE pubs<br />
IF EXISTS (SELECT name&nbsp; FROM sysobjects WHERE name='first_proc'&nbsp; AND type='P'&nbsp; ) <br />
DROP PROCEDURE first_proc<br />
GO<br />
CREATE PROCEDURE first_proc&nbsp; <br />
&nbsp;&nbsp; @title varchar(40)='默认值%',@sum money OUTPUT<br />
AS<br />
SELECT @sum=SUM(price)<br />
&nbsp;&nbsp;&nbsp; FROM titles<br />
&nbsp;&nbsp; WHERE title LIKE @title<br />
GO<br />
DECLARE @sum money <br />
exec first_proc 'The%',@sum&nbsp; OUTPUT <br />
if @sum&lt;200<br />
&nbsp;&nbsp; begin<br />
&nbsp;&nbsp;&nbsp;&nbsp; print ''<br />
&nbsp;&nbsp;&nbsp;&nbsp; print 'the sum is less than $200'<br />
else<br />
&nbsp;&nbsp;&nbsp;&nbsp; select 'the sum is' +RTRIM (CAST(@sum as varchar(20)))<br />
&nbsp;
<img src ="http://www.blogjava.net/Crying/aggbug/146738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-09-20 11:50 <a href="http://www.blogjava.net/Crying/articles/146738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>