??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产精品亚洲一区二区,国产亚洲精品成人久久网站 ,亚洲色偷偷色噜噜狠狠99http://m.tkk7.com/zqli/archive/2009/09/14/294979.html放水老?/dc:creator>放水老?/author>Mon, 14 Sep 2009 02:22:00 GMThttp://m.tkk7.com/zqli/archive/2009/09/14/294979.htmlhttp://m.tkk7.com/zqli/comments/294979.htmlhttp://m.tkk7.com/zqli/archive/2009/09/14/294979.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/294979.htmlhttp://m.tkk7.com/zqli/services/trackbacks/294979.htmlMS SQL性能是很不错的,但是数据库用了一D|间之后,数据库却变得很大Q实际的数据量不大。一般都是数据库日志引v的!数据库日志的增长可以辑ֈ好几百M?/p>

|上的MSSQL虚拟Lh也贵Q要想不让数据库容Q只好压~下数据库日志,或者删除数据库日志?br /> 下面我给大家介绍一个方?/p>

1、打开企业理?br /> 2、打开要处理的数据?br /> 3、点击菜?gt;工具>SQL查询分析?br /> 4、在输入H口里面输入:
DUMP TRANSACTION [数据库名] WITH NO_LOG
BACKUP LOG [数据库名] WITH NO_LOG
DBCC SHRINKDATABASE([数据库名])
点击执行Q这样子数据库就操作成功了?/p>

E序里面的方法:(x)
压羃数据库日?br /> --1.清空日志
exec('DUMP TRANSACTION [' @dbname '] WITH NO_LOG')
--2.截断事务日志Q?br /> exec('BACKUP LOG [' @dbname '] WITH NO_LOG')
--3.收羃数据库文?如果不压~?数据库的文g不会(x)减小
exec('DBCC SHRINKDATABASE([' @dbname '])')



]]>
[转]在虚拟主机环境下备䆾数据库ƈ且导出到EXCEL http://m.tkk7.com/zqli/archive/2008/07/02/212127.html放水老?/dc:creator>放水老?/author>Wed, 02 Jul 2008 08:12:00 GMThttp://m.tkk7.com/zqli/archive/2008/07/02/212127.htmlhttp://m.tkk7.com/zqli/comments/212127.htmlhttp://m.tkk7.com/zqli/archive/2008/07/02/212127.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/212127.htmlhttp://m.tkk7.com/zqli/services/trackbacks/212127.html 

在虚拟主机的环境下,因ؓ(f)没有理员权限,只有数据库用权限,定时备䆾SQL数据?/p>

个比较麻?ch)的问题。解x\如下Q(仅对SQL2000有效)
1. 利用T-SQL备䆾数据库到指定目录Q文件名Ҏ(gu)日期指定?br /> 2. 利用Resin的定时功能,定时执行备䆾?br /> 3. 用户定时下蝲备䆾q且删除q期备䆾?/p>

导出全部数据到Excel也比较实用。下面提供的Ҏ(gu)可以导出库中的全部表Q也可以指定

几个表导出。注意:(x)
1. 因ؓ(f)是导出全部数据,在数据比较多的情况下慎用?br /> 2. 理论上应该适用各种JDBC数据库,仅对SQL2000试q?br /> 3. 对于B/S下蝲Q徏议不要在服务器上生成文gQ以免造成垃圾文g。直接从HTTP的Response中取得OutputStreamq行输出?br /> 4. Excel操作的API请到q里下蝲Q?a >http://www.andykhan.com/jexcelapi/

package steeven;
import jxl.write.*;
import java.util.*;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.Types;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.DateFormat;
import java.io.*;

/**
 * <p>Title: 数据库备?lt;/p>
 * <p>Description: 在Java中备份数据库</p>
 * @author steeven
 * @version 1.0
 */
public class DBackup{
    Context ctx ;
    public DBackup(Context ctx) {
        this.ctx = ctx;
    }
    /**
     * 备䆾SQL2000数据库到文gQ整个数据库备䆾
     * 文g名后面将q加备䆾q月日。例如:(x)c:\dbBackup\mydb031109
     * @param file 导出的文件名全\径。例如:(x)"c:\\dbBackup\\mydb"
     */
    public void backup(String dbName, String file)throws SQLException{
        String sql = "BACKUP DATABASE ["+dbName+"] TO DISK = N'";
        sql += file + new SimpleDateFormat("yyMMdd").format(new Date());
        sql += "' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'lvdong',  NOSKIP , 

STATS = 10,  NOFORMAT";
        Statement stmt = ctx.getConnection().createStatement();
        stmt.executeUpdate(sql);
    }
    /**
     * 导出整个数据库到Excel
     * @param conn 数据库连?br />      * @param out 输出Stream
     */
    public static void db2Excel(Connection conn,OutputStream out)throws

Exception{
        db2Excel(conn,out,getTables(conn));
    }
    /**
     * 导出数据库中指定的表名到Excel
     * @param conn 数据库连?br />      * @param out 输出Stream
     * @param tables 表名
     * @throws Exception
     */
    public static void db2Excel(Connection conn,OutputStream out,List

tables)throws Exception{
        WritableWorkbook wb = jxl.Workbook.createWorkbook(out);
        for (int i = 0; i < tables.size(); i++) {
            WritableSheet sheet = wb.createSheet(tables.get(i).toString(),i);
            writeSheet(sheet,tables.get(i).toString(),conn);
        }
        wb.write();
        wb.close();
    }
    /**
     * 导出表数据到Excel的sheet
     */
    public static void writeSheet(
        WritableSheet sheet,String table,Connection conn)
        throws Exception
    {
        //取得所有表数据
        String sql = "select * from "+DB.ESC1+table+DB.ESC2;
        ResultSet rs = conn.createStatement().executeQuery(sql);
        //Ҏ(gu)ResultSet的MetaData取得表头Q列敎ͼ列宽
        java.sql.ResultSetMetaData meta = rs.getMetaData();
        int n = meta.getColumnCount();
        int row = 0;
        WritableCellFormat fmt = new WritableCellFormat();
        fmt.setBackground(jxl.format.Colour.YELLOW);
        for (int i = 0; i < n; i++){
            //导出表头
            sheet.addCell(new Label(i, row, meta.getColumnLabel(i + 1),fmt));
            //讑֮列宽
//            sheet.setColumnView(i,meta.getColumnDisplaySize(i+1));
        }
        row++;
        while(rs.next()){
            for (int i = 0; i < n; i++){
                //Ҏ(gu)列的cd军_Excel中对应的CellcdQ缺省ؓ(f)文本?br />                 WritableCell cell ;
                switch(meta.getColumnType(i+1)){
                    case Types.BIT:
                    case Types.BIGINT:
                    case Types.BOOLEAN:
                    case Types.DECIMAL:
                    case Types.FLOAT:
                    case Types.INTEGER:
                    case Types.NUMERIC:
                    case Types.REAL:
                    case Types.SMALLINT:
                    case Types.TINYINT:
                        double val = rs.getDouble(i+1);
                        if (rs.wasNull()) cell = new jxl.write.Blank(i,row);
                        cell = new jxl.write.Number(i, row, val);
                        break;
                    case Types.DATE:
                    case Types.TIME:
                    case Types.TIMESTAMP:
                        Date date = rs.getDate(i + 1);
                        if (rs.wasNull()) cell = new jxl.write.Blank(i,row);
                        else cell = new jxl.write.DateTime(i, row, date);
                        break;
                    default:
                        cell = new Label(i, row, rs.getString(i + 1));
                } //end of switch
                sheet.addCell(cell);
            }//end of for each column
            row++;
        }//end of while(rs.next())
    }
    /**
     * 从Connection的MetaData取得所有数据表的名U?br />      */
    public static List getTables(Connection conn)throws Exception{
        ResultSet rs = conn.getMetaData().getTables(
            null,null,null,new String[]{"Table"});
        List list = new ArrayList();
        while(rs.next())
            list.add(rs.getString(3));
        rs.close();
        return list;
    }

    public static void main(String[] args) throws Exception{
        Connection conn = DB.getConn();
        FileOutputStream out = new FileOutputStream("c:\\test.xls");
        db2Excel(conn,out);
        out.close();
        conn.close();
    }
}

------------------------------------
关于虚拟L的数据库如何备䆾
1.最早的时候用sqlserver的备份功能,在本地可以实玎ͼ用程序调用就可以了。后来发不到虚拟机的时候才发现Q虚拟机把大部分的存储过E都l关闭了。只好考虑用别的方法?br /> 2.后来Q我q自己写的存储q程来备份数据库Q当时是虚拟L和数据库在同一台机器上Qok没有问题了?br /> 3.现在׃速度问题Q虚拟主机必ȝ到香港,所以第二种Ҏ(gu)没法子实现了?br /> x惛_Q嘿嘿,利用本地的sqlserver?br /> 新徏一个包Q然后点“复制sqlserver 对象d”Q然后输入源/目的/复制的信息。一般如果是数据量比较少的话Q我们可以用替换现有数据Q也是最正常的情况,我觉得这个比较可行,如果是追加的话,׃(x)丢失修改的信息。然后,虚拟L的sqlserver一般需要用户名密码Q那么我们就在自己本地的sqlserver的安全里面也增加相同用户名及(qing)密码。这h们执行的时候就不会(x)出问题了?br /> 然后我们保存q个包,信sqlagent服务已经启动。如果启动了Q那么我们在数据转换服务-本地包,然后叛_我们刚才创徏的包Q选择调度。设定一个时间段Q我一般选择12点,那时候大安d饭了~~


]]>
SQLServer几种q接字符串服务器名的区别http://m.tkk7.com/zqli/archive/2007/07/03/127934.html放水老?/dc:creator>放水老?/author>Tue, 03 Jul 2007 11:12:00 GMThttp://m.tkk7.com/zqli/archive/2007/07/03/127934.htmlhttp://m.tkk7.com/zqli/comments/127934.htmlhttp://m.tkk7.com/zqli/archive/2007/07/03/127934.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/127934.htmlhttp://m.tkk7.com/zqli/services/trackbacks/127934.html

]]>
关于一个不大常用的SQL数据cdQUNIQUEIDENTIFIER http://m.tkk7.com/zqli/archive/2007/01/30/96653.html放水老?/dc:creator>放水老?/author>Tue, 30 Jan 2007 01:01:00 GMThttp://m.tkk7.com/zqli/archive/2007/01/30/96653.htmlhttp://m.tkk7.com/zqli/comments/96653.htmlhttp://m.tkk7.com/zqli/archive/2007/01/30/96653.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/96653.htmlhttp://m.tkk7.com/zqli/services/trackbacks/96653.html   
  GUID的唯一值是p机|卡的标识数加上一个CPU旉产生的唯一数而得到的。网卡制造商臛_在下一?00q内能保证网卡的唯一性? 
   
  UNIQUEIDENTIFIERg能像IDENTITY属性那栯动生。要想ؓ(f)你的表格对象产生UNIQUEIDENTIFIER|你必L定NEWID函数为column的缺省倹{? 
   
  例如Q如果你惌创徏一个表格列Z的跨国公司的所有子公司的尖端品的收入Qƈ且你希望指定一个GUID数据cdQ那么你可以键入Q? 
   
  CREATE   TABLE   NetRevenueTable  
   
  (UniqueColumn   UNIQUEIDENTIFIER   DEFAULT   NEWID(),  
   
  Characters   VARCHAR(10))  
   
  在数据库工具中,你要在数据库图表中或当你正在设计一个表格时做这件事情。ؓ(f)你想唯一定的column选择Is   RowGUID。缺省情况将?newid())Q它自动产生RowGUID? 
   
  管在许多情况下你必M证表格对象的唯一性,但是如果你决定用UNIQUEIDENTIFIER数据cdQ请注意以下Ҏ(gu):(x)  
   
        1.   q些值是长而且难懂的? 
        2.   q些值是随机的,不带有对用户有意义的样式? 
        3.   q些值在依靠q箋增加的值的应用E序中很难用? 
        4.   q些值有16字节Q很大,因此用这些钥匙构建烦(ch)引会(x)更慢。   ?


 全局唯一标识W?. NET中没有对应的数据cd。   这个列的|数据库系l会(x)自动生成。这个列Ҏ(gu)不需要你为它d数据Q只要把其他数据列添完提交他?x)自动生成数据?img src ="http://m.tkk7.com/zqli/aggbug/96653.html" width = "1" height = "1" />

]]>
攉-数据库优?/title><link>http://m.tkk7.com/zqli/archive/2007/01/15/94017.html</link><dc:creator>放水老?/dc:creator><author>放水老?/author><pubDate>Mon, 15 Jan 2007 11:35:00 GMT</pubDate><guid>http://m.tkk7.com/zqli/archive/2007/01/15/94017.html</guid><wfw:comment>http://m.tkk7.com/zqli/comments/94017.html</wfw:comment><comments>http://m.tkk7.com/zqli/archive/2007/01/15/94017.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/zqli/comments/commentRss/94017.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zqli/services/trackbacks/94017.html</trackback:ping><description><![CDATA[1   逻辑数据库和表的设计     <br />    数据库的逻辑设计、包括表与表之间的关pL优化关系型数据库性能的核心。一个好的逻辑数据库设计可以ؓ(f)优化数据库和应用E序打下良好的基?    <br />    <br />    标准化的数据库逻辑设计包括用多的、有怺关系的窄(jing)表来代替很多列的长数据表。下面是一些用标准化表的一些好处?    <br />    <br />  A:׃表窄(jing)Q因此可以排序和徏立烦(ch)引更?    <br />  B:׃多表Q所以多镞的索引成ؓ(f)可能     <br />  C:更窄(jing)更紧凑的索引     <br />  D:每个表中可以有少一些的索引Q因此可以提高insert   update   delete{的速度Q因些操作在索引多的情况下会(x)对系l性能产生很大的媄(jing)?    <br />  E:更少的空值和更少的多余|增加了数据库的紧凑性由于标准化Q所以会(x)增加了在获取数据时引用表的数目和光的连接关pȝ复杂性。太多的表和复杂的连接关pM(x)降低服务器的性能Q因此在q两者之间需要综合考虑?    <br />    定义h相关关系的主键和外来键时应该注意的事主要是Q用于连接多表的主键和参考的键要有相同的数据cd?    <br />    <br />    2   索引的设?    <br />  A:量避免表扫?    <br />  (g)查你的查询语句的where子句Q因是优化器重要x的地斏V包含在where里面的每一列(column)都是可能的侯选烦(ch)引,辑ֈ最优的性能Q考虑在下面给出的例子Q对于在where子句中给Zcolumn1q个列?    <br />  下面的两个条件可以提高烦(ch)引的优化查询性能Q?    <br />  W一Q在表中的column1列上有一个单索引     <br />  W二Q在表中有多索引Q但是column1是第一个烦(ch)引的?    <br />  避免定义多烦(ch)引而column1是第二个或后面的索引Q这L(fng)索引不能优化服务器性能     <br />  例如Q下面的例子用了pubs数据库?    <br />  SELECT   au_id,   au_lname,   au_fname   FROM   authors     <br />  WHERE   au_lname   =   ’White?    <br />  按下面几个列上徏立的索引会(x)是对优化器有用的索引     <br />  ?au_lname     <br />  ?au_lname,   au_fname     <br />  而在下面几个列上建立的烦(ch)引将不会(x)对优化器起到好的作用     <br />  ?au_address     <br />  ?au_fname,   au_lname     <br />  考虑使用H的索引在一个或两个列上Q窄(jing)索引比多索引和复合烦(ch)引更能有效。用H的索引Q在每一上     <br />  会(x)有更多的行和更少的烦(ch)引别(相对与多索引和复合烦(ch)引而言Q,q将推进pȝ性能?    <br />  对于多列索引QSQL   Serverl持一个在所有列的烦(ch)引上的密度统计(用于联合Q和在第一个烦(ch)引上?    <br />  histogramQ柱状图Q统计。根据统计结果,如果在复合烦(ch)引上的第一个烦(ch)引很被选择使用Q那么优化器对很多查询请求将不会(x)使用索引?    <br />  有用的烦(ch)引会(x)提高select语句的性能Q包括insert,uodate,delete?    <br />  但是Q由于改变一个表的内容,会(x)影响索引。每一个insert,update,delete语句会(x)使性能下降一些。实验表明,不要在一个单表上用大量的索引Q不要在׃n的列上(指在多表中用了参考约束)使用重叠的烦(ch)引?    <br />  在某一列上(g)查唯一的数据的个数Q比较它与表中数据的行数做一个比较。这是数据的选择性,q比较结果将?x)帮助你军_是否某一列作Z选的索引列,如果需要,建哪一U烦(ch)引。你可以用下面的查询语句q回某一列的不同值的数目?    <br />  select   count(distinct   cloumn_name)   from   table_name     <br />  假设column_name是一?0000行的表,则看column_nameq回值来军_是否应该使用Q及(qing)应该使用什么烦(ch)引?    <br />  Unique   values   Index     <br />    <br />  5000   Nonclustered   index     <br />  20   Clustered   index     <br />  3   No   index     <br />    <br />  镞烦(ch)引和非镞索引的选择     <br />    <br />  <1:>镞烦(ch)引是行的物理序和烦(ch)引的序是一致的。页U,低层{烦(ch)引的各个U别上都包含实际的数据页。一个表只能是有一个镞索引。由于update,delete语句要求相对多一些的L作,因此镞烦(ch)引常常能加速这L(fng)操作。在臛_有一个烦(ch)引的表中Q你应该有一个镞索引?    <br />  在下面的几个情况下,你可以考虑用镞索引Q?    <br />  例如Q?  某列包括的不同值的个数是有限的Q但是不是极的Q?    <br />  ֮表的州名列有50个左右的不同州名的羃写|可以使用镞烦(ch)引?    <br />  例如Q?  对返回一定范围内值的列可以用镞索引Q比如用between,>,>=,<,<={等来对列进行操作的列上?    <br />  select   *   from   sales   where   ord_date   between   ?/1/93?  and   ?/1/93?    <br />  例如Q?  Ҏ(gu)询时q回大量l果的列可以使用镞烦(ch)引?    <br />  SELECT   *   FROM   phonebook   WHERE   last_name   =   ’Smith?    <br />    <br />  当有大量的行正在被插入表中时Q要避免在本表一个自然增长(例如Qidentity列)的列上徏立镞索引。如果你建立了镞的烦(ch)引,那么insert的性能׃(x)大大降低。因为每一个插入的行必d表的最后,表的最后一个数据页?    <br />  当一个数据正在被插入Q这时这个数据页是被锁定的)Q所有的其他插入行必ȝ待直到当前的插入已经l束?    <br />  一个烦(ch)引的叶中包括实际的数据页Qƈ且在盘上的数据늚ơ序是跟镞烦(ch)引的逻辑ơ序一L(fng)?    <br />    <br />  <2:>一个非镞的索引是行的物理ơ序与烦(ch)引的ơ序是不同的。一个非镞烦(ch)引的叶包含了指向行数据늚指针?    <br />  在一个表中可以有多个非镞索引Q你可以在以下几个情况下考虑使用非镞索引?    <br />  在有很多不同值的列上可以考虑使用非镞索引     <br />  例如Q一个part_id列在一个part表中     <br />  select   *   from   employee   where   emp_id   =   ’pcm9809f?    <br />  查询语句中用order   by   子句的列上可以考虑使用镞烦(ch)?    <br />    <br />  3   查询语句的设?    <br />    <br />  SQL   Server优化器通过分析查询语句Q自动对查询q行优化q决定最有效的执行方案。优化器分析查询语句来决定那个子句可以被优化Qƈ针对可以被优化查询的子句来选择有用的烦(ch)引。最后优化器比较所有可能的执行Ҏ(gu)q择最有效的一个方案出来?    <br />  在执行一个查询时Q用一个where子句来限制必d理的行数Q除非完全需要,否则应该避免在一个表中无限制地读q处理所有的行?    <br />  例如下面的例子,     <br />  select   qty   from   sales   where   stor_id=7131     <br />  是很有效的比下面q个无限制的查询     <br />  select   qty   from   sales     <br />  避免l客L(fng)最后数据选择q回大量的结果集。允许SQL   Serverq行满它目的的函数限制l果集的大小是更有效的?    <br />  q能减少|络I/Oq能提高多用L(fng)相关q发时的应用E序性能。因Z化器x的焦点就是where子句的查询,以利用有用的索引。在表中的每一个烦(ch)引都可能成ؓ(f)包括在where子句中的侯选烦(ch)引。ؓ(f)了最好的性能可以늅下面的用于一个给定列column1的烦(ch)引?    <br />  W一Q在表中的column1列上有一个单索引     <br />  W二Q在表中有多索引Q但是column1是第一个烦(ch)引的列不要在where子句中用没有column1列烦(ch)引的查询语句Qƈ避免在where子句用一个多索引的非W一个烦(ch)引的索引?    <br />  q时多烦(ch)引是没有用的?    <br />  For   example,   given   a   multicolumn   index   on   the   au_lname,   au_fname   columns   of   the   authors   table   in     <br />  the   pubs   database,     <br />  下面q个query语句利用了au_lname上的索引     <br />  SELECT   au_id,   au_lname,   au_fname   FROM   authors     <br />  WHERE   au_lname   =   ’White?    <br />  AND   au_fname   =   ’Johnson?    <br />  SELECT   au_id,   au_lname,   au_fname   FROM   authors     <br />  WHERE   au_lname   =   ’White?    <br />  下面q个查询没有利用索引Q因Z使用了多索引的非W一个烦(ch)引的索引     <br />  SELECT   au_id,   au_lname,   au_fname   FROM   authors     <br />  WHERE   au_fname   =   ’Johnson’ ?<br /><img src ="http://m.tkk7.com/zqli/aggbug/94017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zqli/" target="_blank">放水老?/a> 2007-01-15 19:35 <a href="http://m.tkk7.com/zqli/archive/2007/01/15/94017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]数据库烦(ch)?/title><link>http://m.tkk7.com/zqli/archive/2007/01/15/94016.html</link><dc:creator>放水老?/dc:creator><author>放水老?/author><pubDate>Mon, 15 Jan 2007 11:33:00 GMT</pubDate><guid>http://m.tkk7.com/zqli/archive/2007/01/15/94016.html</guid><wfw:comment>http://m.tkk7.com/zqli/comments/94016.html</wfw:comment><comments>http://m.tkk7.com/zqli/archive/2007/01/15/94016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zqli/comments/commentRss/94016.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zqli/services/trackbacks/94016.html</trackback:ping><description><![CDATA[用户Ҏ(gu)据库最频繁的操作是q行数据查询。一般情况下Q数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时Q搜索数据就需要很长的旉Q这造成了服务器的资源浪贏Vؓ(f)了提高检索数据的能力Q数据库引入了烦(ch)引机制。本章将介绍索引的概念及(qing)其创Z理?br /><br /><span id="llhx9vv" class="style2">8.1.1 索引的概?/span><br />索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识q些值的数据늚逻辑指针清单。烦(ch)引是依赖于表建立的,它提供了数据库中~排表中数据的内部方法。一个表的存储是׃部分l成的,一部分用来存放表的数据面Q另一部分存放索引面。烦(ch)引就存放在烦(ch)引页面上Q通常Q烦(ch)引页面相对于数据面来说得多。当q行数据(g)索时Q系l先搜烦(ch)索引面Q从中找到所需数据的指针,再直接通过指针从数据页面中d数据。从某种E度上,可以把数据库看作一本书Q把索引看作书的目录Q通过目录查找书中的信息,昄较没有目录的书方ѝ快捗?<br /><br />索引和关键字?qing)约束有较大的联pR关键字可以分ؓ(f)两类Q一U是逻辑关键字,卛_ “数据库基础章”节中介l的Q另一U是物理关键字,它用来定义烦(ch)引的列,也即索引?br /><br /><span id="dbzvjlj" class="style2">8.1.2 索引的结?/span><br />Q?Q?索引的B-?wi)结?br />SQL Server 中的索引是以B-?wi)结构来l护的,如图8-1 所C。B-?wi)是一个多层次、自l护的结构。一个B-?wi)包括一个顶层,UCؓ(f)根节点(Root NodeQ;0 到多个中间层QIntermediateQ;一个底层(Level 0Q,底层中包括若q叶子节点(Leaf NodeQ。在?8-1 中,每个Ҏ(gu)代表一个烦(ch)引页Q烦(ch)引列的宽度越大,B-?wi)的深度深Q即层次多Q?br /><br /><img height="219" src="http://edu.cnzz.cn/newsfile/050606154882500.gif" width="560" /><br /><br />d记录所要访问的索引就多。也是_(d)数据查询的性能随索引列层ơ数目的增加而降低??-1 索引的B-?wi)结?br />在SQL Server 的数据库中按存储l构的不同将索引分ؓ(f)两类Q簇索引QClustered IndexQ和非簇索引QNonclustered IndexQ?<br /><br />Q?Q?烦(ch)引簇索引对表的物理数据页中的数据按列q行排序Q然后再重新存储到磁盘上Q即烦(ch)引与数据是؜Z体,的它的叶节点中存储的是实际的数据。由于簇索引对表中的数据一一q行了排序,因此用簇索引查找数据很快。但׃烦(ch)引将表的所有数据完全重新排列了Q它所需要的I间也就特别大,大概相当于表中数据所占空间的120% 。表的数据行只能以一U排序方式存储在盘上,所以一个表只能有一个簇索引?<br /><br />Q?Q?非簇索引非簇索引h与表的数据完全分ȝl构Q用非烦(ch)引不用将物理数据中的数据按列排序。非烦(ch)引的叶节点中存储了组成非烦(ch)引的关键字的值和行定位器。行定位器的l构和存储内容取决于数据的存储方式。如果数据是以簇索引方式存储的,则行定位器中存储的是烦(ch)引的索引键;如果数据不是以簇索引方式存储的,q种方式又称为堆存储方式QHeap StructureQ,则行定位器存储的是指向数据行的指针。非烦(ch)引将行定位器按关键字的值用一定的方式排序Q这个顺序与表的行在数据中的排序是不匹配的。由于非烦(ch)引用烦(ch)引页存储因此它比烦(ch)引需要更多的存储I间且检索效率较低但一个表只能Z个簇索引Q当用户需要徏立多个烦(ch)引时需要用非烦(ch)引了。从理论上讲Q一个表最多可以徏249 个非烦(ch)引?br /><img src ="http://m.tkk7.com/zqli/aggbug/94016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zqli/" target="_blank">放水老?/a> 2007-01-15 19:33 <a href="http://m.tkk7.com/zqli/archive/2007/01/15/94016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Sql 中日期函数的比较 http://m.tkk7.com/zqli/archive/2007/01/11/93248.html放水老?/dc:creator>放水老?/author>Thu, 11 Jan 2007 12:22:00 GMThttp://m.tkk7.com/zqli/archive/2007/01/11/93248.htmlhttp://m.tkk7.com/zqli/comments/93248.htmlhttp://m.tkk7.com/zqli/archive/2007/01/11/93248.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/93248.htmlhttp://m.tkk7.com/zqli/services/trackbacks/93248.htmlselect convert(varchar(8),getdate(),112)

Sql 中日期函数的比较
作?corin 日期:2006-06-15
字体大小: ??大?
下午公司的项目完成了?x)员pȝQ会(x)员可以后台设|到期时_(d)

大概字段有PostDate,EndDate标志注册旉和到期时_(d)

上午把到期时_(d)剩余天数?4时d和和注册的用户多完成了,用了一个函数DateDitt

(g)?4时d和注册用L(fng)Sql语句Q?/p>

Case "Login":strSql=strSql+HZ.iif(Instr(strSql,"Where")>0," AND DateDiff(hh,LastDate,getdate())<25"," Where DateDiff(hh,LastDate,getdate())<25")
Case "Reg":strSql=strSql+HZ.iif(Instr(strSql,"Where")>0," AND DateDiff(hh,PostDate,getdate())<25"," Where DateDiff(hh,PostDate,getdate())<25")

其时已经实现了会(x)员到期自动红子提C,后来要完成搜索就是可以把d期还剩余15天的?x)员多列丑և来,用DateDiff函数调试了半天多不正,刚开始以为是?”的问题Q?后来(g)查了发现没有问题基本认是DateDiff函数问题Q可是上面检时间的时候正,而且Sql中也可是使用q个函数Q郁闷大概调试了2个小旉题依然没有解冻I

偶然惛_了DateAdd函数改SQL语句如下Q?/p>

Case "EndDate":strSql=strSql+HZ.iif(Instr(strSql,"Where")>0," AND EndDate < DateAdd(d,15,getdate())"," Where EndDate < DateAdd(d,15,getdate())")

调试通过Q呼呼奇怪的问题后台ȝ上搜索下也没有满意的{案Q只是找到这样一D?/p>

Select member_number, first_name, last_name  FROM members
Where DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改?
Select member_number, first_name, last_name  FROM members
Where dateofbirth < DATEADD(yy,-21,GETDATE())
卻I(x)M对列的操作都导致表扫描Q它包括数据库函数、计表辑ּ{等Q查询时要尽可能操作移至等号右辏V?/p>

]]>
DataViewhttp://m.tkk7.com/zqli/archive/2007/01/08/92402.html放水老?/dc:creator>放水老?/author>Mon, 08 Jan 2007 08:15:00 GMThttp://m.tkk7.com/zqli/archive/2007/01/08/92402.htmlhttp://m.tkk7.com/zqli/comments/92402.htmlhttp://m.tkk7.com/zqli/archive/2007/01/08/92402.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/92402.htmlhttp://m.tkk7.com/zqli/services/trackbacks/92402.html  在实际编E工E中Q常帔R到这L(fng)情况QDataTableq不是数据库中的Q或者DataTable未写到数据库,或者从数据库中d的DataTable已经在本地被改动Q又没有写回数据库(可能q要作其他改动)Q在q些情况下,要查询DataTable中的数据Q强大的SQL语言派不上用场了?
   
  有些.NETE序员采取在数据库中建立临时表等Ҏ(gu)来解册cL询问题。而我觉得q种Ҏ(gu)不可行,其实只要?NETcd中提供的DataViewcȝ强大功能Q主要是用它的RowFilter属性)Q就能方便地解决q类查询问题。下面就举一个具体的例子Q来说明如何不用SQL语句Q用DataView的RowFilter属性来查询。?br />    
  用DataView的RowFilter属性完全能辑ֈSQL语句SELECT语句所实现的功?
   
  RowFilter中的查询语句与SQL语句中SELECT语句的语法和作用都极为相|以下是摘自MSDN中关于RowFilter查询语句的语法说明:(x)
   
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
  用户定义的值可以用在将与列D行比较的表达式内。字W串值应攑֜单引号内。日期值应攑֜符?(#) 内。对于数|允许使用数和科学记数法。例如:(x) 
    
  "FirstName = 'John'"  
   
  "Price <= 50.00"    
   
  "Birthdate < #1/31/82#"    
   
  对于包含枚D值的列,值强制{换ؓ(f)整数数据cd。例如:(x) 
   
  "EnumColumn = 5"    
   
  q算W   ?
   
  使用布尔?AND、OR ?NOT q算W时允许串联。可以用括hl合子句和强制优先。AND q算W优先于其他q算W。例如:(x) 
   
  (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'    
   
  在创建比较表辑ּӞ允许使用下列q算W:(x) 
   
  < 
   
  >   
   
  <=    
   
  >=   
   
  <> 
    
  = 
     
  IN 
     
  LIKE 
      
  在表辑ּ中还支持下列术q算W:(x) 
      
  +Q加Q?
     
  -Q减Q?
      
  *Q乘Q?
      
  /Q除Q?
      
  %Q模敎ͼ 
      
  字符串运符 
      
  若要q接字符Ԍ请?+ 字符。字W串比较是否区分大小写由 DataSet cȝ CaseSensitive 属性的值来定。但是,可以?DataTable cȝ CaseSensitive 属性重写此倹{?
     
  通配W?
      
  ?LIKE 比较中,* ?% 两者可以互换地作ؓ(f)通配W。如?LIKE 子句中的字符串包?* ?%Q那么这些字W应用中括号Q[]Q对其进行{义。如果子句中有中括号Q那么中括号字符应用中括号对其进行{义(例如 [[] ?[]]Q。在模式的开头和l尾Q或者在模式的结,或在模式的开头允怋用通配W。例如:(x) 
      
  "ItemName LIKE '*product*'" 
      
  "ItemName LIKE '*product'" 
      
  "ItemName LIKE 'product*'" 
      
  在字W串的中间不允许使用通配W。例如,不允?'te*xt'。?
     
  ?子关pd用?
      
  通过在列名称前面?ParentQ就可以在表辑ּ中引用父表。例如,Parent.Price 引用父表的名?Price 的列。?
     
  通过在列名称前面加一?ChildQ就可以在表辑ּ中引用子表中的列。但是,因ؓ(f)子关pd以返回多行,所以必d聚合函数中包括对子列的引用。例如,Sum(Child.Price) 返回子表中名ؓ(f) Price 的列的d。?
      
  如果某个表有多个子表Q则语法是:(x)Child(RelationName)。例如,如果某个表有两个子表Q它们的名称分别?Customers ?OrdersQ则 DataRelation 对象被命名ؓ(f) Customers2OrdersQ引用将为:(x) 
      
  Avg(Child(Customers2Orders).Quantity) 
      
  聚合 
      
  支持下列聚合cdQ?
      
  SumQ求和) 
      
  AvgQ^均) 
      
  MinQ最| 
      
  MaxQ最大| 
      
  CountQ计敎ͼ 
      
  StDevQ统计标准偏差) 
      
  VarQ统计方差)。?
     
  聚合通常沿着关系执行。通过使用上面列出的函C一和上面“父/子关pd用”中详述的子表列Q来创徏聚合表达式。例如:(x) 
     
  Avg(Child.Price) 
      
  Avg(Child(Orders2Details).Price) 
      
  聚合也可以在单个表上执行。例如,若要为名为“Price”的列中的数字创建汇总,qQ?
      
  Sum(Price) 


]]>
[搜集整理]sql存储q程教程http://m.tkk7.com/zqli/archive/2007/01/08/92326.html放水老?/dc:creator>放水老?/author>Mon, 08 Jan 2007 03:08:00 GMThttp://m.tkk7.com/zqli/archive/2007/01/08/92326.htmlhttp://m.tkk7.com/zqli/comments/92326.htmlhttp://m.tkk7.com/zqli/archive/2007/01/08/92326.html#Feedback8http://m.tkk7.com/zqli/comments/commentRss/92326.htmlhttp://m.tkk7.com/zqli/services/trackbacks/92326.html[搜集整理]sql存储q程完全教程

目录

1.sql存储q程概述
2.SQL存储q程创徏
3.sql存储q程?qing)应?br />4.各种存储q程使用指南
5.ASP中存储过E调用的两种方式?qing)比?br />6.SQL存储q程?NET数据库中的应?
7.使用SQL存储q程要特别注意的问题

1.sql存储q程概述

在大型数据库pȝ中,存储q程和触发器h很重要的作用。无论是存储q程q是触发器,都是SQL 语句和流E控制语句的集合。就本质而言Q触发器也是一U存储过E。存储过E在q算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用戯定义存储q程的功能,而且也提供了许多可作为工具用的pȝ存储q程?br />
存储q程的概?br />
    存储q程QStored ProcedureQ是一lؓ(f)了完成特定功能的SQL 语句集,l编译后存储在数据库。中用户通过指定存储q程的名字ƈl出参数Q如果该存储q程带有参数Q来执行它?br />
    在SQL Server 的系列版本中存储q程分ؓ(f)两类Q系l提供的存储q程和用戯定义存储q程。系l过E主要存储在master 数据库中q以sp_为前~Qƈ且系l存储过E主要是从系l表中获取信息,从而ؓ(f)pȝ理员管理SQL Server 提供支持。通过pȝ存储q程QMS SQL Server 中的许多理性或信息性的zdQ如了解数据库对象、数据库信息Q都可以被顺利有效地完成。尽这些系l存储过E被攑֜master 数据库中Q但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过E名前加上数据库名。而且当创Z个新数据库时Q一些系l存储过E会(x)在新数据库中被自动创建。用戯定义存储q程是由用户创徏q能完成某一特定功能Q如查询用户所需数据信息Q的存储q程。在本章中所涉及(qing)到的存储q程主要是指用户自定义存储过E?br />
    存储q程的优?br />
    当利用MS SQL Server 创徏一个应用程序时QTransaction-SQL 是一U主要的~程语言。若q用Transaction-SQL 来进行编E,有两U方法。其一是,在本地存储Transaction- SQL E序Qƈ创徏应用E序向SQL Server 发送命令来对结果进行处理。其二是Q可以把部分用Transaction-SQL ~写的程序作为存储过E存储在SQL Server 中,q创建应用程序来调用存储q程Q对数据l果q行处理存储q程能够通过接收参数向调用者返回结果集Q结果集的格式由调用者确定;q回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句Qƈ且可以在一个存储过E中调用另一存储q程?

    我们通常更偏׃使用W二U方法,卛_SQL Server 中用存储过E而不是在客户计算Z调用Transaction-SQL ~写的一D늨序,原因在于存储q程h以下优点Q?br />
    Q?Q?存储q程允许标准lg式编E?br />
    存储q程在被创徏以后可以在程序中被多ơ调用,而不必重新编写该存储q程的SQL 语句。而且数据库专业h员可随时对存储过E进行修改,但对应用E序源代码毫无媄(jing)响(因ؓ(f)应用E序源代码只包含存储q程的调用语句)Q从而极大地提高了程序的可移植性?br />
    Q?Q?存储q程能够实现较快的执行速度

    如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行Q那么存储过E要比批处理的执行速度快很多。因为存储过E是预编译的Q在首次q行一个存储过E时Q查询优化器对其q行分析、优化,q给出最l被存在pȝ表中的执行计划。而批处理的Transaction- SQL 语句在每ơ运行时都要q行~译和优化,因此速度相对要慢一些?br />
    Q?Q?存储q程能够减少|络量

    对于同一个针Ҏ(gu)据数据库对象的操作(如查询、修改)Q如果这一操作所涉及(qing)到的 Transaction-SQL 语句被组l成一存储q程Q那么当在客戯机上调用该存储q程Ӟ|络中传送的只是该调用语句,否则是多条SQL 语句Q从而大大增加了|络量Q降低网l负载?br />
    Q?Q?存储q程可被作ؓ(f)一U安全机制来充分利用

    pȝ理员通过Ҏ(gu)行某一存储q程的权限进行限Ӟ从而能够实现对相应的数据访问权限的限制Q避免非授权用户Ҏ(gu)据的讉KQ保证数据的安全。(我们在14 章“SQLServer 的用户和安全性管理”中对存储过E的q一应用作更为清晰的介绍Q?br />
    注意Q存储过E虽然既有参数又有返回|但是它与函数不同。存储过E的q回值只是指明执行是否成功,q且它不能像函数那样被直接调用,也就是在调用存储q程Ӟ在存储过E名字前一定要有EXEC保留字?/div>

2.SQL存储q程创徏

创徏存储q程Q存储过E是保存h的可以接受和q回用户提供的参数的 Transact-SQL 语句的集合?br />  
  可以创徏一个过E供怹使用Q或在一个会(x)话中临时使用Q局部(f)时过E)Q或在所有会(x)话中临时使用Q全局临时q程Q?br />  
  也可以创建在 Microsoft? SQL Server? 启动时自动运行的存储q程?br />  
  语法
  CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
      [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
  
  [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
  
  [ FOR REPLICATION ]
  
  AS sql_statement [ ...n ]

参数
  procedure_name
  
  新存储过E的名称。过E名必须W合标识W规则,且对于数据库?qing)其所有者必d一?br />  要创建局部(f)时过E,可以?procedure_name 前面加一个编L(fng) (#procedure_name)Q要创徏全局临时q程Q可以在 procedure_name 前面加两个编L(fng) (##procedure_name)。完整的名称Q包?# ?##Q不能超q?128 个字W。指定过E所有者的名称是可选的?br />  
  ;number
  
  是可选的整数Q用来对同名的过E分l,以便用一?DROP PROCEDURE 语句卛_同l的q程一起除厅R例如,名ؓ(f) orders 的应用程序用的q程可以命名?orderproc;1、orderproc;2 {。DROP PROCEDURE orderproc 语句除L个组。如果名UC包含定界标识W,则数字不应包含在标识W中Q只应在 procedure_name 前后使用适当的定界符?br />  
  @parameter
  
  q程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必d执行q程时提供每个所声明参数的|除非定义了该参数的默认|。存储过E最多可以有 2.100 个参数?br />  
  使用 @ W号作ؓ(f)W一个字W来指定参数名称。参数名U必ȝ合标识符的规则。每个过E的参数仅用于该q程本nQ相同的参数名称可以用在其它q程中。默认情况下Q参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称?br />  data_type
  
  参数的数据类型。所有数据类型(包括 text、ntext ?imageQ均可以用作存储q程的参数。不q,cursor 数据cd只能用于 OUTPUT 参数。如果指定的数据cd?cursorQ也必须同时指定 VARYING ?OUTPUT 关键字?br />  说明 对于可以?cursor 数据cd的输出参敎ͼ没有最大数目的限制?br />  
  
  VARYING
  
  指定作ؓ(f)输出参数支持的结果集Q由存储q程动态构造,内容可以变化Q。仅适用于游标参数?br />  
  default
  
  参数的默认倹{如果定义了默认|不必指定该参数的值即可执行过E。默认值必L帔R?NULL。如果过E将对该参数使用 LIKE 关键字,那么默认g可以包含通配W(%、_、[] ?[^]Q?br />  
  OUTPUT
  
  表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。?OUTPUT 参数可将信息q回l调用过E。Text、ntext ?image 参数可用?OUTPUT 参数。?OUTPUT 关键字的输出参数可以是游标占位符?br />  
  n
  
  表示最多可以指?2.100 个参数的占位W?br />  
  {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
  
  RECOMPILE 表明 SQL Server 不会(x)~存该过E的计划Q该q程在q行旉新编译。在使用非典型值或临时D不希望覆盖~存在内存中的执行计划时Q请使用 RECOMPILE 选项?br />  
  ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。?ENCRYPTION 可防止将q程作ؓ(f) SQL Server 复制的一部分发布?br />  
  
  
  说明 在升U过E中QSQL Server 利用存储?syscomments 中的加密注释来重新创建加密过E?br />  
  
  FOR REPLICATION
  
  指定不能在订阅服务器上执行ؓ(f)复制创徏的存储过E?使用 FOR REPLICATION 选项创徏的存储过E可用作存储q程{选,且只能在复制q程中执行。本选项不能?WITH RECOMPILE 选项一起用?br />  
  AS
  
  指定q程要执行的操作?br />  
  sql_statement
  
  q程中要包含的Q意数目和cd?Transact-SQL 语句。但有一些限制?br />  
  n
  
  是表C此q程可以包含多条 Transact-SQL 语句的占位符?br />  
  注释
  存储q程的最大大ؓ(f) 128 MB?/div>
用户定义的存储过E只能在当前数据库中创徏Q(f)时过E除外,临时q程L?tempdb 中创建)。在单个批处理中QCREATE PROCEDURE 语句不能与其?Transact-SQL 语句l合使用?
  
  默认情况下,参数可ؓ(f)I。如果传?NULL 参数值ƈ且该参数?CREATE ?ALTER TABLE 语句中用,而该语句中引用的列又不允怋?NULLQ则 SQL Server ?x)生一条错误信息。ؓ(f)了防止向不允怋?NULL 的列传?NULL 参数|应向q程中添加编E逻辑或ؓ(f)该列使用默认|使用 CREATE ?ALTER TABLE ?DEFAULT 关键??br />  
  在存储过E的M CREATE TABLE ?ALTER TABLE 语句中都为每列显式指?NULL ?NOT NULLQ例如在创徏临时表时。ANSI_DFLT_ON ?ANSI_DFLT_OFF 选项控制 SQL Server 为列指派 NULL ?NOT NULL Ҏ(gu)的方式Q如果在 CREATE TABLE ?ALTER TABLE 语句中没有指定的话)。如果某个连接执行的存储q程对这些选项的设|与创徏该过E的q接的设|不同,则ؓ(f)W二个连接创建的表列可能?x)有不同的?f)I性,q且表现Z同的行ؓ(f)方式。如果ؓ(f)每个列显式声明了 NULL ?NOT NULLQ那么将Ҏ(gu)有执行该存储q程的连接用相同的为空性创Z(f)时表?br />  
  在创建或更改存储q程ӞSQL Server 保?SET QUOTED_IDENTIFIER ?SET ANSI_NULLS 的设|。执行存储过E时Q将使用q些原始讄。因此,所有客L(fng)?x)话?SET QUOTED_IDENTIFIER ?SET ANSI_NULLS 讄在执行存储过E时都将被忽略。在存储q程中出现的 SET QUOTED_IDENTIFIER ?SET ANSI_NULLS 语句不媄(jing)响存储过E的功能?br />  
  其它 SET 选项Q例?SET ARITHABORT、SET ANSI_WARNINGS ?SET ANSI_PADDINGSQ在创徏或更改存储过E时不保存。如果存储过E的逻辑取决于特定的讄Q应在过E开头添加一?SET 语句Q以保讄正确。从存储q程中执?SET 语句Ӟ该设|只在存储过E完成之前有效。之后,讄恢复ؓ(f)调用存储q程时的倹{这使个别的客户端可以设|所需的选项Q而不?x)?jing)响存储过E的逻辑?br />  

天(dng)风云  19:30:43
说明 SQL Server 是将I字W串解释为单个空D是解释ؓ(f)真正的空字符Ԍ由兼容别设|控制。如果兼容别小于或{于 65QSQL Server 将I字W串解释为单个空根{如果兼容别等?70Q则 SQL Server 空字符串解释ؓ(f)I字W串?br />  获得有关存储q程的信?br />  若要昄用来创徏q程的文本,请在q程所在的数据库中执行 sp_helptextQƈ使用q程名作为参数?
  
  
  
  说明 使用 ENCRYPTION 选项创徏的存储过E不能?sp_helptext 查看?br />  
  
  若要昄有关q程引用的对象的报表Q请使用 sp_depends?
  
  若要E重命名Q请使用 sp_rename?/div>

引用对象
  SQL Server 允许创徏的存储过E引用尚不存在的对象。在创徏Ӟ只进行语法检查。执行时Q如果高速缓存中无有效的计划,则编译存储过E以生成执行计划。只有在~译q程中才解析存储q程中引用的所有对象。因此,如果语法正确的存储过E引用了不存在的对象Q则仍可以成功创建,但在q行时将p|Q因为所引用的对象不存在?br />  延迟名称解析和兼容?br />  SQL Server 允许 Transact-SQL 存储q程在创建时引用不存在的表。这U能力称为gq名U解析。不q,如果 Transact-SQL 存储q程引用了该存储q程中定义的表,而兼容别设|(通过执行 sp_dbcmptlevel 来设|)?65Q则在创建时?x)发告信息。而如果在q行时所引用的表不存在,返回错误信息?br />  执行存储q程
  成功执行 CREATE PROCEDURE 语句后,q程名称存储在 sysobjects pȝ表中Q?CREATE PROCEDURE 语句的文本将存储?syscomments 中。第一ơ执行时Q将~译该过E以定(g)索数据的最佌问计划?br />  
  使用 cursor 数据cd的参?br />  存储q程只能?cursor 数据cd用于 OUTPUT 参数。如果ؓ(f)某个参数指定?cursor 数据cdQ也必须指定 VARYING ?OUTPUT 参数。如果ؓ(f)某个参数指定?VARYING 关键字,则数据类型必L cursorQƈ且必L?OUTPUT 关键字?br />  
  
  
  说明 cursor 数据cd不能通过数据?APIQ例?OLE DB、ODBC、ADO ?DB-LibraryQ绑定到应用E序变量上。因为必dl定 OUTPUT 参数Q应用程序才可以执行存储q程Q所以带?cursor OUTPUT 参数的存储过E不能通过数据?API 调用。只有将 cursor OUTPUT 变量赋值给 Transact-SQL 局?cursor 变量Ӟ才可以通过 Transact-SQL 批处理、存储过E或触发器调用这些过E?br />  
  
  Cursor 输出参数
  在执行过E时Q以下规则适用?cursor 输出参数Q?
  
  对于只进游标Q游标的l果集中q回的行只是那些存储q程执行l束时处于或出游标位置的行Q例如:(x)
  在过E中的名?RS ?100 行结果集上打开一个非滚动游标?
  
  
  q程提取l果?RS 的头 5 行?br />  
  
  q程q回到其调用者?br />  
  
  q回到调用者的l果?RS ?RS 的第 6 ?100 行组成,调用者中的游标处?RS 的第一行之前?
  对于只进游标Q如果存储过E完成后Q游标位于第一行的前面Q则整个l果集将q回l调用批处理、存储过E或触发器。返回时Q游标将位于W一行的前面?br />  
  
  对于只进游标Q如果存储过E完成后Q游标的位置出最后一行的l尾Q则用批处理、存储过E或触发器返回空l果集?
  
  
  说明 I结果集与空g同?br />  
  对于可滚动游标,在存储过E执行结束时Q结果集中的所有行均会(x)q回l调用批处理、存储过E或触发器。返回时Q游标保留在q程中最后一ơ执行提取时的位|?br />  
  
  对于Lcd的游标,如果游标关闭Q则空g递回调用批处理、存储过E或触发器。如果将游标指派l一个参敎ͼ但该游标从未打开q,也会(x)出现q种情况?
  
  
  说明 关闭状态只有在q回时才有媄(jing)响。例如,可以在过E中关闭游标Q稍后再打开游标Q然后将该游标的l果集返回给调用批处理、存储过E或触发器?br />  
  
  临时存储q程
  SQL Server 支持两种临时q程Q局部(f)时过E和全局临时q程。局部(f)时过E只能由创徏该过E的q接使用。全局临时q程则可由所有连接用。局部(f)时过E在当前?x)话l束时自动除厅R全局临时q程在用该q程的最后一个会(x)话结束时除去。通常是在创徏该过E的?x)话l束时?br />  
  临时q程?# ?## 命名Q可以由M用户创徏。创E后Q局部过E的所有者是唯一可以使用该过E的用户。执行局部(f)时过E的权限不能授予其他用户。如果创Z全局临时q程Q则所有用户均可以讉K该过E,权限不能昑ּ废除。只有在 tempdb 数据库中h昑ּ CREATE PROCEDURE 权限的用P才可以在该数据库中显式创Z(f)时过E(不用编L(fng)命名Q。可以授予或废除q些q程中的权限?
  
  
  
  说明 频繁使用临时存储q程?x)?tempdb 中的pȝ表上产生争用Q从而对性能产生负面影响。徏议?sp_executesql 代替。sp_executesql 不在pȝ表中存储数据Q因此可以避免这一问题?br />
自动执行存储q程
  SQL Server 启动时可以自动执行一个或多个存储q程。这些存储过E必ȝpȝ理员创建,q在 sysadmin 固定服务器角色下作ؓ(f)后台q程执行。这些过E不能有M输入参数?
  
  对启动过E的数目没有限制Q但是要注意Q每个启动过E在执行旉?x)占用一个连接。如果必d启动时执行多个过E,但不需要ƈ行执行,则可以指定一个过E作为启动过E,让该q程调用其它q程。这样就只占用一个连接?br />  
  在启动时恢复了最后一个数据库后,卛_始执行存储过E。若要蟩q这些存储过E的执行Q请启动参数指定ؓ(f)跟踪标记 4022。如果以最低配|启?SQL ServerQ?-f 标记Q,则启动存储过E也不会(x)执行?br />  若要创徏启动存储q程Q必M?sysadmin 固定服务器角色的成员dQƈ?master 数据库中创徏存储q程?br />  
  使用 sp_procoption 可以Q?
  
  现有存储过E指定ؓ(f)启动q程?br />  
  
  停止?SQL Server 启动时执行过E?br />  
  
  查看 SQL Server 启动时执行的所有过E的列表?
  存储q程嵌套
  存储q程可以嵌套Q即一个存储过E可以调用另一个存储过E。在被调用过E开始执行时Q嵌套񔞮增加,在被调用q程执行l束后,嵌套U将减少。如果超出最大的嵌套U,?x)整个调用q程铑֤败。可?@@NESTLEVEL 函数q回当前的嵌套?br />  
  若要估计~译后的存储q程大小Q请使用下列性能监视计数器?
  
    
  * 各种分类的高速缓存对象均可以使用q些计数器,包括Ҏ(gu) sql、准?sql、过E、触发器{?br />  
  sql_statement 限制
  除了 SET SHOWPLAN_TEXT ?SET SHOWPLAN_ALL 之外Q这两个语句必须是批处理中仅有的语句Q,M SET 语句均可以在存储q程内部指定。所选择?SET 选项在存储过E执行过E中有效Q之后恢复ؓ(f)原来的设|?
  
  如果其他用户要用某个存储过E,那么在该存储q程内部Q一些语句用的对象名必M用对象所有者的名称限定。这些语句包括:(x)
  
  ALTER TABLE
  
  
  CREATE INDEX
  
  
  CREATE TABLE
  
  
  所?DBCC 语句
  
  
  DROP TABLE
  
  
  DROP INDEX
  
  
  TRUNCATE TABLE
  
  
  UPDATE STATISTICS
  权限
  CREATE PROCEDURE 的权限默认授?sysadmin 固定服务器角色成员和 db_owner ?db_ddladmin 固定数据库角色成员。sysadmin 固定服务器角色成员和 db_owner 固定数据库角色成员可以将 CREATE PROCEDURE 权限转让l其他用戗执行存储过E的权限授予q程的所有者,该所有者可以ؓ(f)其它数据库用戯|执行权限?/div>
CZ
  A. 使用带有复杂 SELECT 语句的简单过E?br />  下面的存储过E从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及(qing)出版C。该存储q程不用Q何参数?br />  
  USE pubs
  IF EXISTS (SELECT name FROM sysobjects
       WHERE name = \'au_info_all\' AND type = \'P\')
    DROP PROCEDURE au_info_all
  GO
  CREATE PROCEDURE au_info_all
  AS
  SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
     ON a.au_id = ta.au_id INNER JOIN titles t
     ON t.title_id = ta.title_id INNER JOIN publishers p
     ON t.pub_id = p.pub_id
  GO
  
  au_info_all 存储q程可以通过以下Ҏ(gu)执行Q?br />  
  EXECUTE au_info_all
  -- Or
  EXEC au_info_all
  
  如果该过E是批处理中的第一条语句,则可使用Q?br />  
  au_info_all

天(dng)风云  19:31:29
B. 使用带有参数的简单过E?br />  下面的存储过E从四个表的联接中只q回指定的作者(提供了姓名)、出版的书籍以及(qing)出版C。该存储q程接受与传递的参数_匚w的倹{?br />  
  USE pubs
  IF EXISTS (SELECT name FROM sysobjects
       WHERE name = \'au_info\' AND type = \'P\')
    DROP PROCEDURE au_info
  GO
  USE pubs
  GO
  CREATE PROCEDURE au_info
    @lastname varchar(40),
    @firstname varchar(20)
  AS
  SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
     ON a.au_id = ta.au_id INNER JOIN titles t
     ON t.title_id = ta.title_id INNER JOIN publishers p
     ON t.pub_id = p.pub_id
    WHERE au_fname = @firstname
     AND au_lname = @lastname
  GO
  
  au_info 存储q程可以通过以下Ҏ(gu)执行Q?br />  
  EXECUTE au_info \'Dull\', \'Ann\'
  -- Or
  EXECUTE au_info @lastname = \'Dull\', @firstname = \'Ann\'
  -- Or
  EXECUTE au_info @firstname = \'Ann\', @lastname = \'Dull\'
  -- Or
  EXEC au_info \'Dull\', \'Ann\'
  -- Or
  EXEC au_info @lastname = \'Dull\', @firstname = \'Ann\'
  -- Or
  EXEC au_info @firstname = \'Ann\', @lastname = \'Dull\'
  
  如果该过E是批处理中的第一条语句,则可使用Q?br />  
  au_info \'Dull\', \'Ann\'
  -- Or
  au_info @lastname = \'Dull\', @firstname = \'Ann\'
  -- Or
  au_info @firstname = \'Ann\', @lastname = \'Dull\'

天(dng)风云  19:31:41
C. 使用带有通配W参数的单过E?br />  下面的存储过E从四个表的联接中只q回指定的作者(提供了姓名)、出版的书籍以及(qing)出版C。该存储q程对传递的参数q行模式匚wQ如果没有提供参敎ͼ则用预讄默认倹{?br />  
  USE pubs
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'au_info2\' AND type = \'P\')
    DROP PROCEDURE au_info2
  GO
  USE pubs
  GO
  CREATE PROCEDURE au_info2
    @lastname varchar(30) = \'D%\',
    @firstname varchar(18) = \'%\'
  AS
  SELECT au_lname, au_fname, title, pub_name
  FROM authors a INNER JOIN titleauthor ta
    ON a.au_id = ta.au_id INNER JOIN titles t
    ON t.title_id = ta.title_id INNER JOIN publishers p
    ON t.pub_id = p.pub_id
  WHERE au_fname LIKE @firstname
    AND au_lname LIKE @lastname
  GO
  
  au_info2 存储q程可以用多U组合执行。下面只列出了部分组合:(x)
  
  EXECUTE au_info2
  -- Or
  EXECUTE au_info2 \'Wh%\'
  -- Or
  EXECUTE au_info2 @firstname = \'A%\'
  -- Or
  EXECUTE au_info2 \'[CK]ars[OE]n\'
  -- Or
  EXECUTE au_info2 \'Hunter\', \'Sheryl\'
  -- Or
  EXECUTE au_info2 \'H%\', \'S%\'
--------------------------------------------------------------------------------




天(dng)风云  19:32:22
D. 使用 OUTPUT 参数
  OUTPUT 参数允许外部q程、批处理或多?Transact-SQL 语句讉K在过E执行期间设|的某个倹{下面的CZ创徏一个存储过E?(titles_sum)Qƈ使用一个可选的输入参数和一个输出参数?br />  
  首先Q创E:(x)
  
  USE pubs
  GO
  IF EXISTS(SELECT name FROM sysobjects
     WHERE name = \'titles_sum\' AND type = \'P\')
    DROP PROCEDURE titles_sum
  GO
  USE pubs
  GO
  CREATE PROCEDURE titles_sum @@TITLE varchar(40) = \'%\', @@SUM money OUTPUT
  AS
  SELECT \'Title Name\' = title
  FROM titles
  WHERE title LIKE @@TITLE
  SELECT @@SUM = SUM(price)
  FROM titles
  WHERE title LIKE @@TITLE
  GO
  
  接下来,该 OUTPUT 参数用于控制语a?
  
  
  
  说明 OUTPUT 变量必须在创和用该变量旉q行定义?br />  
  
  参数名和变量名不一定要匚wQ不q数据类型和参数位置必须匚wQ除非?@@SUM = variable 形式Q?
  
  DECLARE @@TOTALCOST money
  EXECUTE titles_sum \'The%\', @@TOTALCOST OUTPUT
  IF @@TOTALCOST < 200
  BEGIN
    PRINT \' \'
    PRINT \'All of these titles can be purchased for less than $200.\'
  END
  ELSE
    SELECT \'The total cost of these titles is $\'
       + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
  
  下面是结果集Q?br />  
  Title Name                               
  ------------------------------------------------------------------------
  The Busy Executive\'s Database Guide
  The Gourmet Microwave
  The Psychology of Computer Cooking
  
  (3 row(s) affected)
  
  Warning, null value eliminated from aggregate.
  
  All of these titles can be purchased for less than $200.

天(dng)风云  19:32:33
E. 使用 OUTPUT 游标参数
  OUTPUT 游标参数用来存储过E的局部游标传递回调用批处理、存储过E或触发器?br />  
  首先Q创Z下过E,?titles 表上声明q打开一个游标:(x)
  
  USE pubs
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'titles_cursor\' and type = \'P\')
  DROP PROCEDURE titles_cursor
  GO
  CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
  AS
  SET @titles_cursor = CURSOR
  FORWARD_ONLY STATIC FOR
  SELECT *
  FROM titles
  
  OPEN @titles_cursor
  GO
  
  接下来,执行一个批处理Q声明一个局部游标变量,执行上述q程以将游标赋值给局部变量,然后从该游标提取行?br />  
  USE pubs
  GO
  DECLARE @MyCursor CURSOR
  EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
  WHILE (@@FETCH_STATUS = 0)
  BEGIN
    FETCH NEXT FROM @MyCursor
  END
  CLOSE @MyCursor
  DEALLOCATE @MyCursor
  GO

天(dng)风云  19:32:43
 F. 使用 WITH RECOMPILE 选项
  如果E提供的参数不是典型的参敎ͼq且新的执行计划不应高速缓存或存储在内存中QW(xu)ITH RECOMPILE 子句?x)很有帮助?br />  
  USE pubs
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'titles_by_author\' AND type = \'P\')
    DROP PROCEDURE titles_by_author
  GO
  CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = \'%\'
  WITH RECOMPILE
  AS
  SELECT RTRIM(au_fname) + \' \' + RTRIM(au_lname) AS \'Authors full name\',
    title AS Title
  FROM authors a INNER JOIN titleauthor ta
    ON a.au_id = ta.au_id INNER JOIN titles t
    ON ta.title_id = t.title_id
  WHERE au_lname LIKE @@LNAME_PATTERN
  GO



天(dng)风云  19:32:59
G. 使用 WITH ENCRYPTION 选项
  WITH ENCRYPTION 子句对用户隐藏存储过E的文本。下例创建加密过E,使用 sp_helptext pȝ存储q程获取关于加密q程的信息,然后试直接?syscomments 表中获取关于该过E的信息?br />  
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'encrypt_this\' AND type = \'P\')
    DROP PROCEDURE encrypt_this
  GO
  USE pubs
  GO
  CREATE PROCEDURE encrypt_this
  WITH ENCRYPTION
  AS
  SELECT *
  FROM authors
  GO
  
  EXEC sp_helptext encrypt_this
  
  下面是结果集Q?br />  
  The object\'s comments have been encrypted.
  
  接下来,选择加密存储q程内容的标识号和文本?br />  
  SELECT c.id, c.text
  FROM syscomments c INNER JOIN sysobjects o
    ON c.id = o.id
  WHERE o.name = \'encrypt_this\'
  
  下面是结果集Q?br />  
  
  
  说明 text 列的输出昄在单独一行中。执行时Q该信息与 id 列信息出现在同一行中?br />  
  
  id     text                            
  ---------- ------------------------------------------------------------
  1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????
  
  (1 row(s) affected)

天(dng)风云  19:33:10
H. 创徏用户定义的系l存储过E?br />  下面的示例创Z个过E,昄表名?emp 开头的所有表?qing)其对应的?ch)引。如果没有指定参敎ͼ该过E将q回表名?sys 开头的所有表Q及(qing)索引Q?br />  
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'sp_showindexes\' AND type = \'P\')
    DROP PROCEDURE sp_showindexes
  GO
  USE master
  GO
  CREATE PROCEDURE sp_showindexes
    @@TABLE varchar(30) = \'sys%\'
  AS
  SELECT o.name AS TABLE_NAME,
    i.name AS INDEX_NAME,
    indid AS INDEX_ID
  FROM sysindexes i INNER JOIN sysobjects o
    ON o.id = i.id
  WHERE o.name LIKE @@TABLE
  GO    
  USE pubs
  EXEC sp_showindexes \'emp%\'
  GO
  
  下面是结果集Q?br />  
  TABLE_NAME    INDEX_NAME    INDEX_ID
  ---------------- ---------------- ----------------
  employee     employee_ind   1
  employee     PK_emp_id    2
  
  (2 row(s) affected)

天(dng)风云  19:33:24
I. 使用延迟名称解析
  下面的示例显C四个过E以?qing)gq名U解析的各种可能使用方式。尽引用的表或列在~译时不存在Q但每个存储q程都可创徏?br />  
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'proc1\' AND type = \'P\')
    DROP PROCEDURE proc1
  GO
  -- Creating a procedure on a nonexistent table.
  USE pubs
  GO
  CREATE PROCEDURE proc1
  AS
    SELECT *
    FROM does_not_exist
  GO 
  -- Here is the statement to actually see the text of the procedure.
  SELECT o.id, c.text
  FROM sysobjects o INNER JOIN syscomments c
    ON o.id = c.id
  WHERE o.type = \'P\' AND o.name = \'proc1\'
  GO
  USE master
  GO
  IF EXISTS (SELECT name FROM sysobjects
     WHERE name = \'proc2\' AND type = \'P\')
    DROP PROCEDURE proc2
  GO
  -- Creating a procedure that attempts to retrieve information from a
  -- nonexistent column in an existing table.
  USE pubs
  GO
  CREATE PROCEDURE proc2
  AS
    DECLARE @middle_init char(1)
    SET @middle_init = NULL
    SELECT au_id, middle_initial = @middle_init
    FROM authors
  GO 
  -- Here is the statement to actually see the text of the procedure.
  SELECT o.id, c.text
  FROM sysobjects o INNER JOIN syscomments c
    ON o.id = c.id
  WHERE o.type = \'P\' and o.name = \'proc2\'

3.sql存储q程?qing)应?/span>

一、简介:(x)
   
   存储q程QStored ProcedureQ, 是一lؓ(f)了完成特定功能的SQL 语句Q集l编译后
    存储在数据库中,用户通过指定存储q程的名字ƈl出参数Q如果该存储q程带有参数来执?br />
它,
    在SQL Server 的系列版本中Q存储过E分Zc:(x)pȝ提供的存储过E和用户自定义存储过E?br />
?br />    pȝSPQ主要存储master 数据库中Qƈ以sp_为前~q且pȝ存储q程主要是从pȝ表中获取
    信息Q从而ؓ(f)pȝ理员管理SQL Server?用户自定义存储过E是q户创建,q能完成
    某一特定功能Q如Q查询用h需数据信息的存储过E?br />   
      存储q程h以下优点
    1.存储q程允许标准lg式编E?模块化设?
    存储q程在被创徏以后Q可以在E序中被多次调用Q而不必重新编写该存储q程的SQL语句Q?br />
且数
    据库专业人员可随时对存储q程q行修改Q但对应用程序源代码毫无影响。因为应用程序源?br />
码只包含?br />    储过E的调用语句Q从而极大地提高了程序的可移植性?br />            
    2.存储q程能够实现快速的执行速度
   如果某一操作包含大量的Transaction-SQL 代码,Q或分别被多ơ执行,那么存储q程要比批处?br />
?br />    执行速度快很多,因ؓ(f)存储q程是预~译的,在首ơ运行一个存储过E时Q查询优化器对其q?br />
行分析优
    化,q给出最l被存在pȝ表中的执行计划,而批处理的Transaction-SQL 语句在每ơ运行时

都要q行
    ~译和优化,因此速度相对要慢一些?br />               
    3.存储q程能够减少|络量
   对于同一个针Ҏ(gu)据数据库对象的操作,如查询修改,如果q一操作所涉及(qing)到的Transaction-SQL
    语句被组l成一存储q程Q那么当在客戯机上调用该存储q程Ӟ|络中传送的只是该调

用语句,?br />    则将是多条SQL 语句从而大大增加了|络量降低|络负蝲?br />            
    4.存储q程可被作ؓ(f)一U安全机制来充分利用
   pȝ理员通过Q对执行某一存储q程的权限进行限Ӟ从而能够实现对相应的数据访问权限的

?br />    制?br />

    二、变?br />
    @I

    三、流E控制语?if else | select case | while )
    Select ... CASE 实例
    DECLARE @iRet INT, @PKDisp VARCHAR(20)
    SET @iRet = '1'
    Select @iRet =
    CASE
        WHEN @PKDisp = '一' THEN 1
        WHEN @PKDisp = '? THEN 2
        WHEN @PKDisp = '? THEN 3
        WHEN @PKDisp = '? THEN 4
        WHEN @PKDisp = '? THEN 5
        ELSE 100
    END

    四、存储过E格?br />        
    创徏存储q程
    Create Proc dbo.存储q程?br />    存储q程参数
    AS
    执行语句
    RETURN
    执行存储q程
    GO
*********************************************************/


-- 变量的声?sql里面声明变量时必d变量前加@W号
    DECLARE @I INT

-- 变量的赋|变量赋值时变量前必dset
    SET @I = 30

-- 声明多个变量
    DECLARE @s varchar(10),@a INT

-- Sql 里if语句
    IF 条g BEGIN
        执行语句
    END
    ELSE BEGIN
        执行语句
    END
            
    DECLARE @d INT
    set @d = 1

    IF @d = 1 BEGIN

    -- 打印
        PRINT '正确'
    END
    ELSE BEGIN
        PRINT '错误'
    END


-- Sql 里的多条仉择语句.
    DECLARE @iRet INT, @PKDisp VARCHAR(20)
    SET @iRet = 1
    Select @iRet =
    CASE
        WHEN @PKDisp = '一' THEN 1
        WHEN @PKDisp = '? THEN 2
        WHEN @PKDisp = '? THEN 3
        WHEN @PKDisp = '? THEN 4
        WHEN @PKDisp = '? THEN 5
        ELSE 100
    END

-- 循环语句
    WHILE 条g BEGIN   
        执行语句
    END

    DECLARE @i INT
    SET @i = 1
    WHILE @i<1000000 BEGIN
        set @i=@i+1
    END
    -- 打印
    PRINT @i


-- TRUNCATE 删除表中的所有行Q而不记录单个行删除操作,不能带条?br />
    /*
    TRUNCATE TABLE 在功能上与不?Where 子句?Delete 语句相同Q二者均删除表中的全部行

。但 TRUNCATE TABLE ?Delete 速度快,且用的pȝ和事务日志资源少?
    Delete 语句每次删除一行,q在事务日志中ؓ(f)所删除的每行记录一VTRUNCATE TABLE 通过

释放存储表数据所用的数据|删除数据Qƈ且只在事务日志中记录늚释放?br />    TRUNCATE TABLE 删除表中的所有行Q但表结构及(qing)其列、约束、烦(ch)引等保持不变。新行标识所?br />
的计数值重|ؓ(f)该列的种子。如果想保留标识计数|h?Delete。如果要删除表定义及(qing)其数据,?br />
使用 Drop TABLE 语句?br />    对于?FOREIGN KEY U束引用的表Q不能?TRUNCATE TABLEQ而应使用不带 Where 子句?

Delete 语句。由?TRUNCATE TABLE 不记录在日志中,所以它不能Ȁz触发器?
    TRUNCATE TABLE 不能用于参与了烦(ch)引视囄表?br />    CZ
        下例删除 authors 表中的所有数据?/
        
        TRUNCATE TABLE authors
               

-- Select INTO 从一个查询的计算l果中创Z个新表?数据q不q回l客L(fng)Q这一点和普通的
-- Select 不同?新表的字D具有和 Select 的输出字D늛兌Q相同)的名字和数据cd?
        
        select * into NewTable
            from Uname


-- Insert INTO Select
        -- 表ABC必须存在
        -- 把表Uname里面的字DUsername复制到表ABC
        Insert INTO ABC Select Username FROM Uname

-- 创徏临时?br />        Create TABLE #temp(
            UID int identity(1, 1) PRIMARY KEY,
            UserName varchar(16),
            Pwd varchar(50),
            Age smallint,
            Sex varchar(6)
        )
        -- 打开临时?br />        Select * from #temp

-- 存储q程
        -- 要创建存储过E的数据?br />        Use Test
        -- 判断要创建的存储q程名是否存?br />            if Exists(Select name From sysobjects Where name='csp_AddInfo' And

type='P')
            -- 删除存储q程
            Drop Procedure dbo.csp_AddInfo
        Go
               
               
        -- 创徏存储q程
        Create Proc dbo.csp_AddInfo
        -- 存储q程参数
        @UserName varchar(16),
        @Pwd varchar(50),
        @Age smallint,
        @Sex varchar(6)
        AS
        -- 存储q程语句?br />        insert into Uname (UserName,Pwd,Age,Sex)
            values (@UserName,@Pwd,@Age,@Sex)
        RETURN
        -- 执行
        GO
               
        -- 执行存储q程
        EXEC csp_AddInfo 'Junn.A','123456',20,'?

4.各种存储q程使用指南

<%@ Language=VBScript %>
<%

'---开始链接数据库
Dim strConnString
strConnString = "driver={SQL Server};server=songhp;uid=sa;pwd=;database=XVZDemo"
set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConnstring
'---l束链接数据?br />
'---开始ؓ(f)输入参数赋?br />Dim SelectSql , SelectRs
Dim SelectID , SelectName , SelectReturn
SelectSql = "Select Max(CompanyID) From Dim_Company"
Set SelectRs = Conn.Execute(SelectSql)
SelectID = SelectRs(0)
'---l束入参数赋?br />
Dim TiggerType
TiggerType = 3

Set Cmd = Server.CreateObject("ADODB.Command")
Set Cmd.ActiveConnection = Conn
Cmd.CommandType = 4   '---声明此过Eؓ(f)存储q程

If TiggerType = 1 then

'---开始一个输入参数的存储q程调用
Cmd.CommandText = "TransCompany1"

Set CmdParam = Cmd.CreateParameter("@TransID",3,1)
Cmd.Parameters.Append CmdParam
Cmd("@TransID") = SelectID
Cmd.Execute
'---l束一个输入参数的存储q程调用

Elseif TiggerType = 2 then

'---开始一个输入参敎ͼ一个输出参数的存储q程调用
Cmd.CommandText = "TransCompany2"

Set CmdParamID = Cmd.CreateParameter("@TransID",3,1)
Cmd.Parameters.Append CmdParamID
Cmd("@TransID") = SelectID
Set CmdParamName = Cmd.CreateParameter("@TransName",202,2,50)
Cmd.Parameters.Append CmdParamName
Cmd.Execute
SelectName = Cmd("@TransName")
'---l束一个输入参敎ͼ一个输出参数的存储q程调用

Elseif TiggerType = 3 then

'---开始一个输入参敎ͼ一个输出参敎ͼ一个返回值的存储q程调用
Cmd.CommandText = "TransCompany3"
Set CmdParamReturn = Cmd.CreateParameter("Return_Value",3,4)
Cmd.Parameters.Append CmdParamReturn
Set CmdParamID = Cmd.CreateParameter("@TransID",3,1)
Cmd.Parameters.Append CmdParamID
Cmd("@TransID") = SelectID
Set CmdParamName = Cmd.CreateParameter("@TransName",202,2,50)
Cmd.Parameters.Append CmdParamName

Cmd.Execute
SelectName = Cmd("@TransName")
SelectReturn = Cmd("Return_Value")
'---l束一个输入参敎ͼ一个输出参敎ͼ一个返回值的存储q程调用


End if

Conn.Close
Set Conn = Nothing
Set Cmd = Nothing
Set CmdParamID = Nothing
Set CmdParamname = Nothing
Set CmdParamReturn = Nothing

%>

5.ASP中存储过E调用的两种方式?qing)比?/span>

本h用sql server 和asp写了一个简单的留言本,在不断的试中发玎ͼ分页昄留言的时候,不同的执行方式,旉上的一些差别?br />
下面通过Ҏ(gu)来看看几U方式的用时Ҏ(gu)?br />
一Q用存储过E分,q种情况又分ZU方式:(x)

W一U,使用command对象Q如下:(x)

Set Cmd=server.CreateObject("Adodb.Command")
Cmd.ActiveConnection=conn
Cmd.CommandText="ycuu_gb_getmsg"
Cmd.CommandType=4'adCmdStoredProc
cmd.prepared=true'
set  param=Cmd.CreateParameter("@iPageNo",adInteger,1,2,Page)
Cmd.Parameters.Append  param
set  param=Cmd.CreateParameter("@iPageSize",adInteger,1,2,PageSizeConst)
Cmd.Parameters.Append  param
set rs=Cmd.execute


W二U,使用connection对象的执行方法直接执行,具体如下Q?br />
set rs=conn.execute ("execute ycuu_gb_getmsg "&page&", "&pagesizeConst)


二,不用存储过E,直接使用ADODB.RecordSet的功能来分页Q具体代码如下:(x)

Set rs = Server.CreateObject("ADODB.Recordset")
sql = "Select * FROM Guestbook Order By dateandtime Desc"
rs.open sql,conn,1,1
rs.pagesize = 150'每页昄的留a数量Q?br />total = rs.RecordCount
mypagesize = rs.pagesize
rs.absolutepage = page

Z更加明显地显C出速度Q我把每|C的留言数量加大?50(事实上当然不?x)设|这么大的数值啦)。至于我机器的配|,q略不说了Q因Z要是速度Ҏ(gu)?br />
发现Q执行的时候时间分别如下:(x)

W一U:(x)E_?.1953125 U到0.2109375 U之_(d)q_值大概是Q?.20U?br />
W二U:(x)E_?.1716875 U到0.1857U之_(d)q_值大概是Q?.177U?br />
W三U:(x)E_?.4375 U到0.4632U之_(d)q_值大概是Q?.45U?br />

但是Q当d的记录条Cؓ(f)20的时候,l果如下Q?br />发现Q执行的时候时间分别如下:(x)

W一U:(x)E_?0390625  U到.0546875  U之_(d)q_值大概是Q?.045U?br />
W二U:(x)E_?.046875  U到.0546875 U之_(d)q_值大概是Q?.050U?br />
W三U:(x)E_?09375 U到0.1015625 U之_(d)q_值大概是Q?.97U?br />
在这L(fng)来,gconn.execute和command.executeq两U方式似乎差别ƈ不大Q?br />而前者的调用方式好像更加单一炏V?br />同时Q在q里可以看出分页的存储过E速度实比recordset的分速度要快很多?br />
PSQ小弟第一ơ发文,呜呜呜,发现写一好的真难,我以后会(x)努力的了。希望大家包涉|q次写得不好。对了,我还想问问各位大侠conn.execute和command.executeq两U方式中那种更加好的Q呵呵,因ؓ(f)我在|上扑ֈ的都是后者这U方式执行存储过E的。不知道Z么不用前面那U那么简单的?/div>

6.SQL存储q程?NET数据库中的应?/span>

一Q前aQ?

存储q程QStored ProcedureQ是一lؓ(f)了完成特定功能的SQL语句集,l编译后存储在数据库中。用户通过指定存储q程的名字ƈl出参数Q如果该存储q程带有参数Q来执行它。存储过E是数据库中的一个重要对象,M一个设计良好的数据库应用程序都应该用到存储q程。ȝ来说Q存储过E具有以下一些优点:(x)

◆存储过E允许标准组件式~程

◆存储过E能够实现较快的执行速度

◆存储过E能够减网l流?

◆存储过E可被作ZU安全机制来充分利用

本文作者将向大家介l?NET数据库应用程序中存储q程的应用,以及(qing)如何它与ADO.NET中的SqlDataAdapter对象、DataSet对象{结合用以提高.NET数据库应用程序的M性能?

二.pȝ要求Q?

开发工P(x)Visual Studio.NET

数据库管理系l:(x)SQL Server 2000Q其中包含了CZE序所用到的Pubs数据库)

三.创徏一个简单的存储q程Q?

q里我将向大家介l如何运用Visual Studio.NET IDE来创建存储过E。运用Visual Studio.NET IDE创徏存储q程是非常容易和直观的,你只要在服务器资源管理器中导向到Pubs数据库ƈ展开节点Q就?x)发现包括存储过E在内的各种数据库对象,如图1所C?





在存储过E节点上点击右键便可弹出一个菜单,其中包含了“新建存储过E”的命o(h)。新Z个存储过E后QIDE中的代码~辑H口便出现如下所C的代码模板Q?



CREATE PROCEDURE dbo.StoredProcedure1
/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT )
*/
AS
/* SET NOCOUNT ON */
RETURN



上面的代码模板符合简化的创徏存储q程的语法规则,完整的语法规则如下:(x)

CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]



限于幅Q各个参数的含义在此׃多作介绍了,有兴的读者可以参考有关SQL Server 2000数据库管理系l的资料?

下面我对该代码模板中的各个语法成分略作介l。CREATE PROCEDURE声明创徏一个存储过E,后面跟着该存储过E的名称。?*…?/”中的成分是该存储过E的参数Q可包括输入参数和输出参数。AS关键字后面的内容是该存储q程的主体部分,其中是Q何数量和cd的包含在存储q程中的SQL语句。RETURN关键字表明存储过E结束ƈ能返回整型状态值给调用者。下面我们就来创Z个简单的不带参数的存储过Eƈq用之:(x)

CREATE PROCEDURE dbo.up_GetPublisherInfo
AS
SELECT pub_id, pub_name, city, state, country
FROM publishers
RETURN






创徏以上存储q程后,保存之。保存完毕,与该存储q程相对应的节点׃(x)出现在服务器资源理器中。同时请注意代码~辑H口中的CREATE关键字变为ALTER关键字了Q该关键字是用于更改M现有的存储过E的。要q行上述存储q程Q只要点d节点q在右键弹出菜单中选择“运行存储过E”,q行的结果图C如下:(x)



四.创徏一个带参数的存储过E:(x)

以上我们创徏了一个简单的不带参数的存储过E,而在实际的应用中往往?x)用到很多带有参数的存储q程。带有参数的存储q程一般是用于更新数据或是插入数据的。下面我们可以运用同L(fng)操作Ҏ(gu)创徏一个带参数的存储过E:(x)



CREATE PROCEDURE dbo.up_UpdatePublisherInfo
(
@pub_id char (4),
@pub_name varchar (40),
@city varchar (20),
@state char (2),
@country varchar (30)
)
AS
UPDATE publishers
SET pub_name = @pub_name, city = @city, state = @state,
 country = @country
WHERE ( pub_id = @pub_id )
RETURN




在上面的创徏存储q程的代码中Q我们通过在名U前d一个“@”标志来声明存储q程的局部变量-参数Q同时还声明了各个参数的cdQ确定了各个参数的方向|也即表明该参数是输入型的q是输出型的或者是输入输出型的或者是q回值型的。用户通过相应的存储过E名UC?qing)正有效的参数便可调用该存储过E了。还有,你可以通过q用OUTPUT关键字在参数中添加输出型的参敎ͼ具体Ҏ(gu)请参考上面的语法规则。输出型的参数能q回l调用者相关的信息?

上面的存储过E能更新publishers表中相应出版商的信息。你可以通过点击该存储过E的节点Q在右键弹出菜单中选择“运行存储过E”来执行它。一旦执行,IDE中便弹出一个输入出版商信息的对话框Q如?所C)。在该对话框中填入正有效的更新信息Q注意pub_id的值在原来的表中必d在,然后点击“确定”按钮便可更新数据了?/div>
7.使用SQL存储q程要特别注意的问题

存储q程是一个运行于SQL数据库之中最核心的事?它通过镉K内存的Ş?q行d\处理\写入最为频J处理的数据.
    ASP虽然在微软的ASPX的R袭下Q仍旧是中小企业l箋在用的一U网语aQ但是当要读取v量数据的时?如果仍旧使用普通的SQLq行dq行与写?导致系l资源的严重费Q所以我们在ASP中用存储过E?以提高数据的存取速度,同时通过SQL核心的获取数据的Ҏ(gu),可以有效的减垃圾数?不被立即使用,而且也不备较短的旉里被使用的数?操作.
    在ASP中用存储过E也是相当的Ҏ(gu),例如以下一个通过SQL存储q程q行分页的方?
存储q程:
CREATE procedure p_splitpage   
@sql nvarchar(4000), --要执行的sql语句
@page int=1,    --要显C的늠
@pageSize int,  --每页的大?
@pageCount int=0 out, --总页?
@recordCount int=0 out --总记录数
as
set nocount on
declare @p1 int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordCount = @pageCount
select @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@page=(@page-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize  
exec sp_cursorclose @p1
GO
ASP面的内?
sql = "Select id, c_s_name from tabNews where deleted<>1 Order By id Desc"
page = cint(page_get)
if page_post<>""then
page = cint(page_post)
end if
if not page > 0 then  
page = 1
end if
pagesize=20’每늚条数
set cmd = server.CreateObject("adodb.command")
cmd.ActiveConnection = conn
cmd.CommandType = 4
cmd.CommandText = "p_SplitPage"
cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql)
cmd.Parameters.Append cmd.CreateParameter("@page",4,1, 4, page)
cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, pageSize)
cmd.Parameters.Append cmd.CreateParameter("@pageCount",4,2, 4, pageCount)
cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, recordCount)
set rs = cmd.Execute
set rs = rs.NextRecordSet
pageCount = cmd.Parameters("@pageCount").value
recordCount = cmd.Parameters("@recordCount").value
if pageCount = 0 then pageCount = 1
if page>pageCount then  
response.Redirect("?page="&pageCount)  
end if
set rs = cmd.Execute
    我们如此可以实现对数据的读取ƈ可以q行有效的分?但是我们往往?x)发C个问?如果我们构造的SQL语句如果使用的是select * from tab ...的话Q就l常出现无法d数据的错?或者是d出来,但是有的数据无法昄的错误,l过仔细的检查发?如果是排列在SQL语句的前列的数据可以被读?而如果不按照SQLd出来的字D进行顺序读?׃(x)出现数据丢失的情?所以唯一的途径是q行序d.?
    对于select id, newsTitle, newsContent from tabNews where ...的SQL语句,应当将所有的数据d到变量上来,q且要求是按照SQL语句的顺序进行读取,然后q些数据可以自q使用?
    id = rs("id")
    newsTitle = rs("newsTitle")
    ...
    分析出现q个的原因是:SQL数据库在构造虚拟表的时候就是以一U先q先出的原则,把所有的数据排列在一个内存段之中,通过序的读?数据逐一的读?而如果蟩q某个具体的字段获取下一个字D늚信息,pȝ׃(x)原来的那个字段的信息丢?以释攑ֆ?q是Zpȝ构造的单性和pȝ的内存最低化的要?所以这样也保证了有限的内存资源得到最充分的发?q也是ؓ(f)什么存储过E比普通的SQL要快的原?



]]>
[转]SQL2000存储q程的基http://m.tkk7.com/zqli/archive/2007/01/08/92324.html放水老?/dc:creator>放水老?/author>Mon, 08 Jan 2007 03:01:00 GMThttp://m.tkk7.com/zqli/archive/2007/01/08/92324.htmlhttp://m.tkk7.com/zqli/comments/92324.htmlhttp://m.tkk7.com/zqli/archive/2007/01/08/92324.html#Feedback1http://m.tkk7.com/zqli/comments/commentRss/92324.htmlhttp://m.tkk7.com/zqli/services/trackbacks/92324.html       SQL Server提供了一U方法,它可以将一些固定的操作集中h由SQL Server数据库服务器来完成,以实现某个Q务,q种Ҏ(gu)是存储q程?br />       存储q程是SQL语句和可选控制流语句的预~译集合Q存储在数据库中Q可由应用程序通过一个调用执行,而且允许用户声明变量、有条g执行以及(qing)其他强大的编E功能?br />       在SQL Server中存储过E分Zc:(x)即系l提供的存储q程和用戯定义的存储过E?br />
       可以ZM使用SQL语句的目的来使用存储q程Q它h以下优点Q?br />       可以在单个存储过E中执行一pdSQL语句?br />       可以从自q存储q程内引用其他存储过E,q可以简化一pd复杂语句?br />       存储q程在创建时卛_服务器上q行~译Q所以执行v来比单个SQL语句快,而且减少|络通信的负担?br />       安全性更高?br />创徏存储q程

       在SQL Server中,可以使用三种Ҏ(gu)创徏存储q程 Q?br />         ①用创建存储过E向导创建存储过E?br />         ②利用SQL Server 企业理器创建存储过E?br />         ③用Transact-SQL语句中的CREATE PROCEDURE命o(h)创徏存储q程?br />
下面介绍使用Transact-SQL语句中的CREATE PROCEDURE命o(h)创徏存储q程
    创徏存储q程前,应该考虑下列几个事项Q?
     ①不能将 CREATE PROCEDURE 语句与其?SQL 语句l合到单个批处理中?br />     ②存储过E可以嵌套用,嵌套的最大深度不能超q?2层?br />     ③创建存储过E的权限默认属于数据库所有者,该所有者可此权限授予其他用户?br />     ④存储过E是数据库对象,其名U必遵守标识符规则?br />     ⑤只能在当前数据库中创徏存储q程?br />     ?一个存储过E的最大尺ؓ(f)128M?br />
使用CREATE PROCEDURE创徏存储q程的语法Ş式如下:(x)

QUOTE:
CREATE PROC[EDURE]procedure_name[;number][;number]
[{@parameter data_type}
[VARYING][=default][OUTPUT]
][,...n] WITH   
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS sql_statement [ ...n ]
用CREATE PROCEDURE创徏存储q程的语法参数的意义如下Q?

procedure_nameQ用于指定要创徏的存储过E的名称?
numberQ该参数是可选的整数Q它用来对同名的存储q程分组Q以便用一?DROP PROCEDURE 语句卛_同l的q程一起除厅R?
@parameterQ过E中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数?
data_typeQ用于指定参数的数据cd?
VARYINGQ用于指定作出OUTPUT参数支持的结果集?
DefaultQ用于指定参数的默认倹{?
OUTPUTQ表明该参数是一个返回参数?


例如Q下面创Z?单的存储q程productinfoQ用于检索品信息?br />USE Northwind
if exists(select name from sysobjects
          where name='productinfo' and type = 'p')
   drop procedure productinfo
GO

create  procedure productinfo
as
select * from products
GO
通过下述sql语句执行该存储过E:(x)execute productinfo
卛_(g)索到产品信息?br />
执行存储q程

直接执行存储q程可以使用EXECUTE命o(h)来执行,其语法Ş式如下:(x)
[[EXEC[UTE]]
   {       [@return_status=]
          {procedure_name[;number]|@procedure_name_var}            [[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}      
      [,...n]
[ WITH RECOMPILE ]



使用 EXECUTE 命o(h)传递单个参敎ͼ它执?showind 存储q程Q以 titles 为参数倹{showind 存储q程需要参?(@tabname)Q它是一个表的名U。其E序清单如下Q?br />    EXEC showind titles
当然Q在执行q程中变量可以显式命名:(x)
    EXEC showind @tabname = titles
如果q是 isql 脚本或批处理中第一个语句,?EXEC 语句可以省略Q?br />    showind titles或者showind @tabname = titles



下面的例子用了默认参数
USE Northwind
GO
CREATE PROCEDURE insert_Products_1
        ( @SupplierID_2         int,
         @CategoryID_3         int,
                 @ProductName_1 nvarchar(40)='?)
AS INSERT INTO Products
         (ProductName,SupplierID,CategoryID)
VALUES
        (@ProductName_1,@SupplierID_2,@CategoryID_3)
GO
exec insert_Products_1 1,1
Select * from Products where SupplierID=1 and CategoryID=1
GO


下面的例子用了q回参数
USE Northwind
GO
CREATE PROCEDURE query_products
(      @SupplierID_1 int,
        @ProductName_2 nvarchar(40) output)
AS
select @ProductName_2 = ProductName   from products
where SupplierID = @SupplierID_1

执行该存储过E来查询SupplierID?的品名Q?br />declare @product nvarchar(40)
exec query_products 1,@product output
select '产品?= @product
go

查看存储q程
   存储q程被创Z后,它的名字存储在pȝ表sysobjects中,它的源代码存攑֜pȝ表syscomments中。可以用用企业管理器或系l存储过E来查看用户创徏的存储过E?br />

使用企业理器查看用户创建的存储q程

   在企业管理器中,打开指定的服务器和数据库,选择要创建存储过E的数据库,单击存储q程文g夹,此时在右边的|中显C数据库的所有存储过E。用右键单击要查看的存储q程Q从弹出的快捯单中选择属性选项Q此时便可以看到存储q程的源代码?


使用pȝ存储q程来查看用户创建的存储q程

可供使用的系l存储过E及(qing)其语法Ş式如下:(x)
sp_helpQ用于显C存储过E的参数?qing)其数据cd
   sp_help [[@objname=] name]
参数name查看的存储过E的名称?
   sp_helptextQ用于显C存储过E的源代?
   sp_helptext [[@objname=] name]
参数name查看的存储过E的名称?br />   sp_dependsQ用于显C和存储q程相关的数据库对象
   sp_depends [@objname=]’object?br />参数object查看依赖关系的存储过E的名称?br />   sp_stored_proceduresQ用于返回当前数据库中的存储q程列表





修改存储q程


    存储q程可以Ҏ(gu)用户的要求或者基表定义的改变而改变。用ALTER PROCEDURE语句可以更改先前通过执行 CREATE PROCEDURE 语句创徏的过E,但不?x)更?gu)限,也不影响相关的存储过E或触发器。其语法形式如下Q?br />   ALTERPROC[EDURE]procedure_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]][,...n] [WITH
   {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS   
sql_statement [ ...n ]

重命名和删除存储q程

1. 重命名存储过E?br />  修改存储q程的名U可以用系l存储过Esp_renameQ其语法形式如下Q?br />      sp_rename  原存储过E名Uͼ新存储过E名U?br />      另外Q通过企业理器也可以修改存储q程的名U?



删除存储q程


   删除存储q程可以使用DROP命o(h)QDROP命o(h)可以一个或者多个存储过E或者存储过E组从当前数据库中删除,其语法Ş式如下:(x)
       drop procedure {procedure} [,…n]
当然Q利用企业管理器也可以很方便地删除存储过E?



存储q程的重新编?

   在我们用了一ơ存储过E后Q可能会(x)因ؓ(f)某些原因Q必d表中新增加数据列或者ؓ(f)表新d索引Q从而改变了数据库的逻辑l构。这Ӟ需要对存储q程q行重新~译QSQL Server提供三种重新~译存储q程的方?Q?br />    1、在建立存储q程时设定重新编?br />       语法格式QCREATE  PROCEDURE   procedure_name    WITH   RECOMPILE    AS   sql_statement
     2、在执行存储q程时设定重~译
       语法格式Q?EXECUTE  procedure_name  WITH  RECOMPILE
    3、通过使用pȝ存储q程讑֮重编?
        语法格式为:(x)  EXEC  sp_recompile  OBJECT

pȝ存储q程与扩展存储过E?

1.pȝ存储q程
           pȝ存储q程存储在master数据库中Qƈ以sp_为前~Q主要用来从pȝ表中获取信息Qؓ(f)pȝ理员管理SQL Server提供帮助Qؓ(f)用户查看数据库对象提供方ѝ比如用来查看数据库对象信息的系l存储过Esp_help、显C存储过E和其它对象的文本的存储q程sp_helptext{?br />

2.扩展存储q程Q?br />          扩展存储q程以xp_为前~Q它是关pL据库引擎的开攑ּ数据服务层的一部分Q其可以使用户在动态链接库(DLL)文g所包含的函C实现逻辑Q从而扩展了Transact-SQL的功能,q且可以象调用Transact-SQLq程那样从Transact-SQL语句调用q些函数?
      ?  利用扩展存储q程xp_cmdshellZ个操作系l外x行指定命令串Qƈ作ؓ(f)文本q回M输出?br />      执行代码Q?br />         use master
          exec xp_cmdshell 'dir *.exe'   
       执行l果q回pȝ目录下的文g内容文本信息?br />
最后给大家举一个例子:(x)

QUOTE:
/**
1、?      在Northwind数据库中Q创Z个带查询参数的存储过E,
要求在输入一个定购金额总额QtotalӞ查询出该值的所
有品的相关信息Q包括品名U和供应商名U、单位数量?br />单h(hun)、以?qing)该产品的定购金额总额Qƈ通过一个输出参数返?br />满查询条g的品数
**/


IF exists (select * from SysObjects where name='more_than_total' and type='p')
   drop procedure more_than_total
go
CREATE PROCEDURE More_Than_Total
        @total money = 0
AS
Declare @amount smallint
BEGIN
        select distinct
           P.productName,
           S.contactName,
           P.UnitPrice
           
    from Products P inner join [order Details] O
         on p.productID=o.productID inner join suppliers s
         on p.supplierID=s.SupplierID
    where O.productID in
    (select productID
     from   [order Details]
     group by productId
     having sum(quantity*unitprice)>@total
    )
END
GO


]]>
[转]存储q程教程Q二Q?/title><link>http://m.tkk7.com/zqli/archive/2007/01/08/92321.html</link><dc:creator>放水老?/dc:creator><author>放水老?/author><pubDate>Mon, 08 Jan 2007 02:52:00 GMT</pubDate><guid>http://m.tkk7.com/zqli/archive/2007/01/08/92321.html</guid><wfw:comment>http://m.tkk7.com/zqli/comments/92321.html</wfw:comment><comments>http://m.tkk7.com/zqli/archive/2007/01/08/92321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zqli/comments/commentRss/92321.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zqli/services/trackbacks/92321.html</trackback:ping><description><![CDATA[ <p>在MS SQL Server 2000 中,创徏一个存储过E有两种Ҏ(gu)Q一U是使用Transaction-SQL 命o(h)Create ProcedureQ?另一U是使用囑Ş化管理工具Enterprise Manager?用Transaction- SQL 创徏存储q程是一U较为快速的Ҏ(gu)Q但对于初学者,使用Enterprise Manager 更易理解Q更为简单?br />当创建存储过E时Q需要确定存储过E的三个l成部分Q? </p> <p> </p> <ul> <li>所有的输入参数以及(qing)传给调用者的输出参数? </li> <li>被执行的针对数据库的操作语句Q包括调用其它存储过E的语句Q? </li> <li>q回l调用者的状态|以指明调用是成功q是p|?</li> </ul> <span id="bxrjlxz" class="style2">12.2.1 使用Enterprise Manager 创徏存储q程</span> <br />按照下述步骤用Enterprise Manager 创徏一个存储过E:(x) <p> </p><ul><li>启动Enterprise ManagerQ?d到要使用的服务器? </li><li>选择要创建存储过E的数据库,在左H格中单击Stored Procedure 文g夹,此时在右H格中显C数据库的所有存储过E,如图12-1 所C? </li><li>叛_Stored Procedure 文g夹,在弹单中选择New Stored Procedure, 此时打开创徏存储q程对话框,如图12-2 所C?img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/284.gif" width="521" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><br /><br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/285.gif" width="399" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /></li><li>输入存储q程正文? </li><li>单击Check SyntaxQ?(g)查语法是否正? </li><li>单击OKQ?保存? </li><li>在右H格中,叛_该存储过E,在弹单中选择All task, 选择ManagePermissionsQ?讄权限Q如?2-3 所C?br /><p> </p><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/286.gif" width="417" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /></li></ul><span id="zfxn3tr" class="style2">12.2.2 用CREATE PROCEDURE 命o(h)创徏存储q程</span><br />通过q用Create Procedure 命o(h)能够创徏存储q程Q在创徏存储q程之前Q应该考虑C下几个方面:(x) <p> </p><ul><li>在一个批处理中,Create Procedure 语句不能与其它SQL 语句合ƈ在一P </li><li>数据库所有者具有默认的创徏存储q程的权限,它可把该权限传递给其它的用P </li><li>存储q程作ؓ(f)数据库对象其命名必须W合命名规则Q? </li><li>只能在当前数据库中创建属于当前数据库的存储过E?</li></ul>用Create Procedure 创徏存储q程的语法规则如下:(x)<br />CREATE PROC [ EDURE ] procedure_name [ ; number ]<br />[ { @parameter data_type }<br />[ VARYING ] [ = default ] [ OUTPUT ]<br />] [ ,...n ]<br />[ WITH<br />{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]<br />[ FOR REPLICATION ]<br />AS sql_statement [ ...n ]<br /><br />各参数的含义如下Q?br /><p> </p><ul><li>procedure_name<br />是要创徏的存储过E的名字Q它后面跟一个可选项numberQ?它是一个整敎ͼ用来区别一l同名的存储q程。存储过E的命名必须W合命名规则Q在一个数据库中或对其所有者而言Q存储过E的名字必须惟一? </li><li>@parameter<br />是存储过E的参数。在Create Procedure 语句中,可以声明一个或多个参数。当调用该存储过E时Q用户必ȝ出所有的参数|除非定义了参数的~省倹{若参数的Ş式以 @parameter=value 出现Q则参数的次序可以不同,否则用户l出的参数值必M参数列表中参数的序保持一致。若某一参数以@parameter=value 形式l出Q那么其它参C必须以该形式l出。一个存储过E至多有1024 个参数? </li><li>Data_type<br />是参数的数据cd。在存储q程中,所有的数据cd包括text 和image 都可被用作参数。但是,游标cursor 数据cd只能被用作OUTPUT 参数。当定义游标数据cdӞ也必dVARING 和OUTPUT 关键字进行定义。对可能是游标型数据cd的OUTPUT 参数而言Q参数的最大数目没有限制? </li><li>VARYING<br />指定由O(jin)UTPUT 参数支持的结果集Q仅应用于游标型参数? </li><li>Default<br />是指参数的缺省倹{如果定义了~省|那么即不给出参数|则该存储q程仍能被调用。缺省值必L常数Q或者是I倹{? </li><li>OUTPUT<br />表明该参数是一个返回参数。用OUTPUT 参数可以向调用者返回信息。Text cd参数不能用作OUTPUT 参数? </li><li>RECOMPILE<br />指明SQL Server q不保存该存储过E的执行计划Q该存储q程每执行一ơ都又要重新~译? </li><li>ENCRYPTION<br />表明SQL Server 加密了syscomments 表,该表的text 字段是包含有Create procedure语句的存储过E文本,使用该关键字无法通过查看syscomments 表来查看存储q程内容? </li><li>FOR REPLICATION<br />选项指明了ؓ(f)复制创徏的存储过E不能在订购服务器上执行Q只有在创徏qo(h)存储q程Ӟ仅当q行数据复制时过滤存储过E才被执行)Q才使用该选项。FOR REPLICATION与WITH RECOMPILE 选项是互不兼容的? </li><li>AS<br />指明该存储过E将要执行的动作? </li><li>Sql_statement<br />是Q何数量和cd的包含在存储q程中的SQL 语句?</li></ul><p> </p>另外应该指出Q一个存储过E的最大尺ؓ(f)128MQ?用户定义的存储过E必d建在当前数据库中?br /> 下面给出几个例子,用来详细介绍如何创徏包含有各U保留字的存储过E?br /><br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/287.gif" width="402" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/288.gif" width="352" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/289.gif" width="327" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/290.gif" width="519" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><br />    <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.studynew.com/Files/Mssql/291.gif" width="183" onload="javascript:if(this.width>500){this.resized=true;this.style.width=500;}" /><br /><img src ="http://m.tkk7.com/zqli/aggbug/92321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zqli/" target="_blank">放水老?/a> 2007-01-08 10:52 <a href="http://m.tkk7.com/zqli/archive/2007/01/08/92321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]存储q程教程Q一Q?/title><link>http://m.tkk7.com/zqli/archive/2007/01/08/92319.html</link><dc:creator>放水老?/dc:creator><author>放水老?/author><pubDate>Mon, 08 Jan 2007 02:50:00 GMT</pubDate><guid>http://m.tkk7.com/zqli/archive/2007/01/08/92319.html</guid><wfw:comment>http://m.tkk7.com/zqli/comments/92319.html</wfw:comment><comments>http://m.tkk7.com/zqli/archive/2007/01/08/92319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zqli/comments/commentRss/92319.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zqli/services/trackbacks/92319.html</trackback:ping><description><![CDATA[在大型数据库pȝ中,存储q程和触发器h很重要的作用。无论是存储q程q是触发器,都是SQL 语句和流E控制语句的集合。就本质而言Q触发器也是一U存储过E。存储过E在q算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用戯定义存储q程的功能,而且也提供了许多可作为工具用的pȝ存储q程?br /><br /><span id="h3t9bzj" class="style2">12.1.1 存储q程的概?/span><br />存储q程QStored ProcedureQ是一lؓ(f)了完成特定功能的SQL 语句集,l编译后存储在数据库。中用户通过指定存储q程的名字ƈl出参数Q如果该存储q程带有参数Q来执行它?br /><br />    在SQL Server 的系列版本中存储q程分ؓ(f)两类Q系l提供的存储q程和用戯定义存储q程。系l过E主要存储在master 数据库中q以sp_为前~Qƈ且系l存储过E主要是从系l表中获取信息,从而ؓ(f)pȝ理员管理SQL Server 提供支持。通过pȝ存储q程QMS SQL Server 中的许多理性或信息性的zdQ如了解数据库对象、数据库信息Q都可以被顺利有效地完成。尽这些系l存储过E被攑֜master 数据库中Q但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过E名前加上数据库名。而且当创Z个新数据库时Q一些系l存储过E会(x)在新数据库中被自动创建。用戯定义存储q程是由用户创徏q能完成某一特定功能Q如查询用户所需数据信息Q的存储q程。在本章中所涉及(qing)到的存储q程主要是指用户自定义存储过E?br /><br /><span id="9ftthtf" class="style2">12.1.2 存储q程的优?/span><br />    当利用MS SQL Server 创徏一个应用程序时QTransaction-SQL 是一U主要的~程语言。若q用Transaction-SQL 来进行编E,有两U方法。其一是,在本地存储Transaction- SQL E序Qƈ创徏应用E序向SQL Server 发送命令来对结果进行处理。其二是Q可以把部分用Transaction-SQL ~写的程序作为存储过E存储在SQL Server 中,q创建应用程序来调用存储q程Q对数据l果q行处理存储q程能够通过接收参数向调用者返回结果集Q结果集的格式由调用者确定;q回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句Qƈ且可以在一个存储过E中调用另一存储q程?<br /><br />    我们通常更偏׃使用W二U方法,卛_SQL Server 中用存储过E而不是在客户计算Z调用Transaction-SQL ~写的一D늨序,原因在于存储q程h以下优点Q?br /><br />Q?Q?存储q程允许标准lg式编E?br />存储q程在被创徏以后可以在程序中被多ơ调用,而不必重新编写该存储q程的SQL 语句。而且数据库专业h员可随时对存储过E进行修改,但对应用E序源代码毫无媄(jing)响(因ؓ(f)应用E序源代码只包含存储q程的调用语句)Q从而极大地提高了程序的可移植性?br /><br />Q?Q?存储q程能够实现较快的执行速度<br />如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行Q那么存储过E要比批处理的执行速度快很多。因为存储过E是预编译的Q在首次q行一个存储过E时Q查询优化器对其q行分析、优化,q给出最l被存在pȝ表中的执行计划。而批处理的Transaction- SQL 语句在每ơ运行时都要q行~译和优化,因此速度相对要慢一些?br /><br />Q?Q?存储q程能够减少|络量<br />对于同一个针Ҏ(gu)据数据库对象的操作(如查询、修改)Q如果这一操作所涉及(qing)到的 Transaction-SQL 语句被组l成一存储q程Q那么当在客戯机上调用该存储q程Ӟ|络中传送的只是该调用语句,否则是多条SQL 语句Q从而大大增加了|络量Q降低网l负载?br /><br />Q?Q?存储q程可被作ؓ(f)一U安全机制来充分利用<br />pȝ理员通过Ҏ(gu)行某一存储q程的权限进行限Ӟ从而能够实现对相应的数据访问权限的限制Q避免非授权用户Ҏ(gu)据的讉KQ保证数据的安全。(我们在14 章“SQLServer 的用户和安全性管理”中对存储过E的q一应用作更为清晰的介绍Q?br /><br /><span id="t1pjxx7" class="style2">注意Q?/span>存储q程虽然既有参数又有q回|但是它与函数不同。存储过E的q回值只是指明执行是否成功,q且它不能像函数那样被直接调用,也就是在调用存储q程Ӟ在存储过E名字前一定要有EXEC保留?br /><img src ="http://m.tkk7.com/zqli/aggbug/92319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zqli/" target="_blank">放水老?/a> 2007-01-08 10:50 <a href="http://m.tkk7.com/zqli/archive/2007/01/08/92319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]一些Select(g)索高U用?/title><link>http://m.tkk7.com/zqli/archive/2006/12/31/91226.html</link><dc:creator>放水老?/dc:creator><author>放水老?/author><pubDate>Sun, 31 Dec 2006 13:50:00 GMT</pubDate><guid>http://m.tkk7.com/zqli/archive/2006/12/31/91226.html</guid><wfw:comment>http://m.tkk7.com/zqli/comments/91226.html</wfw:comment><comments>http://m.tkk7.com/zqli/archive/2006/12/31/91226.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/zqli/comments/commentRss/91226.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zqli/services/trackbacks/91226.html</trackback:ping><description><![CDATA[ <p> <font color="#0000ff"> <span style="COLOR: #000000">SQL五个集合函数Q?/span> <span style="COLOR: #ff00ff">SUM</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #ff00ff">AVG</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #ff00ff">COUNT</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #ff00ff">MAX</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #ff00ff">MIN</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> 通配W的一些用法:(x)(关键字:(x)</span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">%</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">[]</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">)<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">[A-M]%</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  q样可以选择出column字段中首字母在A</span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">M之间的记?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">[ABC]%</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  q样可以选择出column字段中首字母是A或者B或者C的记?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">[A-CG]%</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  q样可以选择出column字段中首字母在A</span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">C之间的或者是G的记?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">[^C]%</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  q样可以选择出column字段中首字母不是C的记?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /><br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> 脱字W(关键字:(x)</span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> _Q?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  通过使用下滑U字W(_Q,可以匚wL单个字符<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">M_crosoft</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> 匚wҎ(gu)字符Q(</span> <span style="COLOR: #ff0000">[</span> <span style="COLOR: #ff0000"> </span> <span style="COLOR: #ff0000">]</span> <span style="COLOR: #000000"> _ </span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">%</span> <span style="COLOR: #000000">Q?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  把他们都攑ֈ</span> <span style="COLOR: #ff0000">[]</span> <span style="COLOR: #000000">中就行了Q比如:(x)<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #808080">like</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">%[%]%</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> 匚w发音Q关键字Q?/span> <span style="COLOR: #ff00ff">SOUNDEX</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff00ff">DIFFERENCE</span> <span style="COLOR: #000000">Q?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  如果不知道一个名字确切的发音Q但是又多少知道一点,可以考虑使用SOUNDEX DIFFERENCE函数?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #808080">*</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000"> tablename </span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #ff00ff">DIFFERENCE</span> <span style="COLOR: #000000">(column1,</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">Laofei</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #808080">></span> <span style="FONT-WEIGHT: bold; COLOR: #800000">3</span> <span style="COLOR: #000000">)<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  DIFFERENCEq回0</span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">4之间的数字,4是非常接q,0是差异非常大<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  要深入了解DIFFERENCE函数的工作原理,使用SOUNDEX函数q回DIFFERENCE函数所使用的音标码<br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  </span> <span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000"> column1 </span> <span style="COLOR: #0000ff">as</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">column</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #ff00ff">SOUNDEX</span> <span style="COLOR: #000000">(column1) </span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">sound like</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000"> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> <br /> <img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" /> 注意Q?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  DIFFERENCE函数比较两个字符串的W一个字母和所有的辅音字母Q该函数忽略M元音字母Q包括YQ?除非元音字母是该字符串的W一个字母?br /><img alt="" src="file:///C:/Documents%20and%20Settings/Administrator/桌面/一些Select(g)索高U用?20-%20!Java%20-%20CSDNBlog.files/None.gif" align="top" />  使用q两个函数在where中执行效果ƈ不好Q所以尽量少使用?/span> <font color="#000000"> </font> <br /> </font> </p> <img src ="http://m.tkk7.com/zqli/aggbug/91226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zqli/" target="_blank">放水老?/a> 2006-12-31 21:50 <a href="http://m.tkk7.com/zqli/archive/2006/12/31/91226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]提高查询速度Ҏ(gu)ȝ http://m.tkk7.com/zqli/archive/2006/12/08/86391.html放水老?/dc:creator>放水老?/author>Fri, 08 Dec 2006 08:35:00 GMThttp://m.tkk7.com/zqli/archive/2006/12/08/86391.htmlhttp://m.tkk7.com/zqli/comments/86391.htmlhttp://m.tkk7.com/zqli/archive/2006/12/08/86391.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/86391.htmlhttp://m.tkk7.com/zqli/services/trackbacks/86391.htmlq个帖子主要ȝ提高查询速度的方法,涉及(qing)到减连接数据库ơ数、徏立烦(ch)引、优化语句等斚w?/p>

关于索引Q推荐{载的q篇文章
http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx

改善SQL语句的效?br />http://community.csdn.net/Expert/topic/5087/5087396.xml?temp=.345669
数据量很大怎样加快索检速度
http://community.csdn.net/Expert/topic/5058/5058320.xml?temp=.1229517
索引建立Ҏ(gu)的区?br />http://community.csdn.net/Expert/topic/5068/5068154.xml?temp=.3010218
频繁插入删除数据需要更新烦(ch)?br />http://community.csdn.net/Expert/topic/4937/4937910.xml?temp=.8428614
试了一下sql server 2005 全文(g)?br />http://community.csdn.net/Expert/topic/4878/4878430.xml?temp=.6049311

其他关于效率的高频问?/p>

判断一个表的数据不在另一个表中最优秀Ҏ(gu)Q?br />http://community.csdn.net/Expert/topic/5038/5038742.xml?temp=.4704553
删除千万U表中重复记录的办法
http://community.csdn.net/Expert/topic/5089/5089261.xml?temp=.7907068

数据库数据查询变得不正常cd问题

大数据量Q稳定运行一D|候以后无法得到查询结果?br />http://community.csdn.net/Expert/topic/4810/4810464.xml?temp=9.014529E-02



]]>
存储技术-NAS与SANhttp://m.tkk7.com/zqli/archive/2006/10/29/77924.html放水老?/dc:creator>放水老?/author>Sun, 29 Oct 2006 12:18:00 GMThttp://m.tkk7.com/zqli/archive/2006/10/29/77924.htmlhttp://m.tkk7.com/zqli/comments/77924.htmlhttp://m.tkk7.com/zqli/archive/2006/10/29/77924.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/77924.htmlhttp://m.tkk7.com/zqli/services/trackbacks/77924.htmlNAS与SAN

    信息时代是一个数据ؓ(f)王的时代。信息在企业的决{、经营和理中发挥的重要作用Q不但改变了企业评估信息的方式,使各企业把信息作ZU超其竞争Ҏ(gu)的战略资产,而且也正在迅速改变企业的商业q作模式Q从发展q猛的中型公司到拥有广泛资源的全球跨国企业。但是信息时代的来(f)也给企业带来了新问题--产生量数据、存储v量数据、访问v量数据。这是因为在互联|商业化后,企业希望通过互联|ؓ(f)客户提供全年无休的服务,同时企业也希望借由互联|汇集、分析一切与客户相关的信息,借此为客h供更好的服务。此外,数据信息存储讑֤的容量不断增加,h却不断下滑,造成了基于Internet和Intranet的电(sh)子商务、企业资源计划(ERPQ、数据仓库、联Z务处理(OLTPQ等数据密集型应用炙手可热,|页数据信息Q视频图像信息和静态数据等成ؓ(f)了企业的关键性业务。数据的爆炸性增长不仅要求企业信息系l能存储日益增涨的数据,合理地管理数据,更重要的是,企业信息pȝ能保证需要数据的q速得到相x据。这l企业信息数据的存储、共享和安全提出了更高的要求Q企业信息数据的存储成ؓ(f)了企业的核心d?
    在传l的企业数据信息存储架构上,信息存储装置大都是个别依附在服务器后面的信息孤岛Q彼此间无法作有效的联结。若要存取某台服务器后面信息存储讑֤上的信息Q必通过区域|络?qing)该台服务器Q这h占据区域|络的带宽,又浪Ҏ(gu)务器CPU的资源。如果要在不同应用程序之间共享数据,q必M独立的信息存储设备中Q将数据复制到另外的信息存储讑֤。这造成了数据用上的时间差。从商业角度来看Q时间差使得做决{的人,必须依照不正和不即时的信息作决{。当?dng)理分散在各地的数据储存pȝQ也是一个非常耗费人力的过E。特别不同信息存储品彼此间的整合性不高,使用者界面亦不尽相同Q企业需要聘误多熟(zhn)不同品和q_Ҏ(gu)的员工Q对个别的信息存储系l进行监控及(qing)理工作。此外,传统的数据信息存储架构,是与所支持的应用程序密切结合的Q因此当应用E序有所更动Ӟ数据信息存储架构必须随之调整?
    因此建立一个具有大规模可׾~性的?4×7q箋可用性的、跨q_的、能够提供多U信息处理系l的q接、信息保护、信息管理、信息分享的企业信息存储pȝQƈ使之成ؓ(f)|络上的一U公用设施,可在整个|络中ؓ(f)企业的所有应用提供无限的性能和容量,成ؓ(f)了企业整体战略的重要l成部分。显?dng)传统的数据信息存储架构面对这L(fng)要求已显得力不从心了Q这时新的技?-|络附加信息存储QNetwork Attached StorageQNASQ及(qing)信息存储区域|络QStorage Area NetworkQSANQ便应运而生了?
    通俗地讲QNAS是一个具有很大信息存储容量的讑֤Q它通过集线器(HUBQ或交换机(SWITCHQ直接连在网l上Qɼ盘I间的扩展如同在|络上添加打印机一L(fng)单方ѝNAS讑֤的物理位|很灉|Q既可以可放|在数据中心的工作组内,也可以放在其它地点,通过物理链\与网l连接v来。NAS讑֤集成了信息存储器Ӟ例如盘驱动器阵列、CD或DVD驱动器、磁带驱动器或可Ud的信息存储介质)和简易服务器Q具有RAID功能和完全的文g服务器功能。集成在NAS讑֤中的易服务器可以有关信息存储的功能与应用服务器执行的其他功能分隔开Q允许用h需应用服务器的q预Q就可以在网l上存取数据。这h可减CPU的开销Q也能显著改善性能。一般认为,NASh安装理方便、h(hun)格^民化{优点,是中企业信息存储的优选方案。而SANQ在最Ua(b)的意义上Q是一个独立于服务器网l系l之外的Q几乎拥有无限信息存储能力的高速信息存储网l。特Ҏ(gu)Z光纤通道技术(F(tun)iber ChannelQ的늼Q交换机和集U器Q将很多的信息存储设备连接v来,再与有很多不同服务器l成的网l相q接Q以多点对多点的方式q行理。SAN不但h高传输速度Q?00MbpsQ、远传输距离Q?0KmQ和支持数量众多的设备等优点Q更为重要的是,SAN使服务器和存储器之间的连接方式发生了Ҏ(gu)性的变革。与传统服务器与盘阵列之间的主/从关pM同,光纤通道SAN上的所有设备均处于q等的地位。多台服务器以及(qing)多个存储器可以配|在同一个SAN上,其中M一台服务器均可存取|络中的M一个信息存储设备,真正实现了在不同的硬件和操作q_之间异构信息存储讑֤和数据的整合Q是C代企业信息存储架构的L?
    NAS和SAN的出玎ͼ再次体现了把信息存储作ؓ(f)专门讑֤的趋ѝ而在未来的几q内Q无论NASq是SANQ都呈现快速成长的局面。IDC预测QNAS的市模将?8q的9亿美元,成长?002q的105亿美元。Datamation则预伎ͼSAN的市模将?8q的30亿美元,成长?002q的114亿美元。但是,SAN的主要功能是高速信息存储,而NAS则偏重于文g׃n。这好比SAN是交通工具里的飞机,而NAS则是火RQ二者各有特点,互不替代?br />



]]>
什么是异构数据?http://m.tkk7.com/zqli/archive/2006/10/25/77214.html放水老?/dc:creator>放水老?/author>Wed, 25 Oct 2006 07:55:00 GMThttp://m.tkk7.com/zqli/archive/2006/10/25/77214.htmlhttp://m.tkk7.com/zqli/comments/77214.htmlhttp://m.tkk7.com/zqli/archive/2006/10/25/77214.html#Feedback0http://m.tkk7.com/zqli/comments/commentRss/77214.htmlhttp://m.tkk7.com/zqli/services/trackbacks/77214.html异构数据库系l是相关的多个数据库pȝ的集合,可以实现数据的共享和透明讉KQ每个数据库pȝ在加入异构数据库pȝ之前本n已l存在,拥有自己的DMBS。异构数据库的各个组成部分具有自w的自治性,实现数据׃n的同Ӟ每个数据库系l仍保有自己的应用特性、完整性控制和安全性控制。异构数据库pȝ的异构性主要体现在以下几个斚wQ?

计算Zpȝ构的异构

各个参与的数据库可以分别q行在大型机、小型机、工作站、PC或嵌入式pȝ中?

基础操作pȝ的异?

各个数据库系l的基础操作pȝ可以是Unix、Windows NT?Linux{?

DMBS本n的异?

可以是同为关pd数据库系l的Oracle?SQL Server{,也可以是不同数据模型的数据库Q如关系、模式、层ơ、网l、面向对象,函数型数据库共同l成一个异构数据库pȝ?

----异构数据库系l的目标在于实现不同数据库之间的数据信息资源、硬件设备资源和人力资源的合q和׃n。其中关键的一点就是以局部数据库模式为基Q徏立全局的数据模式或全局外视图。这U全局模式对于建立高的决{支持系l尤为重要?

----大型机构在许多地炚w有分支机构,每个子机构的数据库中都有着自己的信息数据,而决{制订h员一般只兛_宏观的、ؓ(f)全局模式所描述的信息。徏立在数据仓库技术基上的异构数据库全局模式的描q是一U好的解x案。数据仓库可以从异构数据库系l中的多个数据库中收集信息,q徏立统一的全局模式Q同时收集的数据q支持对历史数据的访问,用户通过数据仓库提供的统一的数据接口进行决{支持的查询?

数据库{?

----对于异构数据库系l,实现数据׃n应当辑ֈ两点Q一是实现数据库转换Q二是实现数据的透明讉K。由华中U技大学开发的Q拥有自ȝ权的商品化数据库理pȝDM3pȝQ通过所提供的数据库转换工具和API接口实现了这两点?

----DM3提供了数据库转换工具Q可以将一U数据库pȝ中定义的模型转化为另一U数据库中的模型Q然后根据需要再装入数据Q这时用户就可以利用自己熟?zhn)的数据库pȝ和熟(zhn)的查询语言Q实现数据共享的目标。数据库转换工具首先q行cd转换Q访问源数据库系l,源数据库的数据定义模型转换为目标数据库的数据定义模型,然后q行数据重组Q即源数据库系l中的数据装入到目的数据库中?

----在{换的q程中,有时要想实现严格的等仯{换是比较困难的。首先要定两种模型中所存在的各U语法和语义上的冲突Q这些冲H可能包括:(x)

命名冲突Q即源模型中的标识符可能是目的模型中的保留字Q这时就需要重新命名?
格式冲突Q同一U数据类型可能有不同的表C方法和语义差异Q这旉要定义两U模型之间的变换函数?
l构冲突Q如果两U数据库pȝ之间的数据定义模型不同,如分别ؓ(f)关系模型和层ơ模型,那么需要重新定义实体属性和联系Q以防止属性或联系信息的丢失?

----MQ在q行数据转换后,一斚w源数据库模式中所有需要共享的信息都{换到目的数据库中Q另一斚wq种转换又不能包含冗余的兌信息?

----数据库{换工具可以实C同数据库pȝ之间的数据模型{换,需要进一步研I的问题是:(x)如果数据库{换同时进行数据定义模式{换和数据转换Q就可能引v同一数据集合在异构数据库pȝ中存在多个副本,因此需要引入新的访问控制机制。在保证各个参与数据库自治,l护其完整性、安全性的基础上,对于异构数据库系l提供全局的访问控制、ƈ发机制和安全控制?

----如果数据库{换只q行数据定义转换Q不产生数据的副本,那么在新的目的数据库定义模型的框架下讉K数据Q实C仍是Ҏ(gu)数据库系l中数据的访问。这时利用新的数据库pȝ中的数据处理语言实现的事务,不能直接讉K源数据库Q必进行事务的翻译才可以执行?

数据的透明讉K

----在异构数据系l中实现了数据的透明讉KQ用户就可以异构分布式数据库系l看成普通的分布式数据库pȝQ用自己熟?zhn)的数据处理语a去访问数据库Q如同访问一个数据库pȝ一栗但目前q没有一U广泛用的数据定义模型和数据查询语aQ实现数据的透明讉K可以采用多对一转换、双向的中间件等技术。开攑ּ数据库互q(Open DataBase Connectivity,UODBCQ是一U用来在相关或不相关的数据库理pȝ中存取数据的标准应用E序接口QAPIQ。ODBC为应用程序提供了一套高层调用接口规范和Z动态链接库的运行支持环境。目前,常用的数据库应用开发的前端工具如Power Builder?Delphi{都通过开放数据库互联(ODBC)接口来连接各U数据库pȝ。而多数数据库理pȝQ如QOracle、Sybase、SQL Server{)都提供了相应的ODBC驱动E序Q数据库系l具有很好的开放性。ODBC接口的最大优Ҏ(gu)其互操作能力Q理x况下Q每个驱动程序和数据源应支持完全相同的ODBC函数调用和SQL语句Q得ODBC应用E序可以操作所有的数据库系l。然而,实际上不同的数据库对SQL语法的支持程度各不相同,因此QODBC规范定义了驱动程序的一致性别,ODBC API的一致性确定了应用E序所能调用的ODBC函数U类QODBC 2.0规定了三个别的函数Q目?DM3 ODBC API支持 ODBC 2.0规范中第二扩展的所有函数?

----随着Internet应用的不断普?qing),Internet的异构分布式信息pȝ正在q速发展,Java以其q_无关性、移植性强Q安全性高、稳定性好、分布式、面向对象等优点而成为Internet应用开发的首选语a。在Internet环境下,实现Z异种pȝq_的数据库应用Q必L供一个独立于特定数据库管理系l的l一~程界面和一个基?SQL的通用的数据库讉KҎ(gu)。Java与数据库接口规范JDBCQJava Database ConnectivityQ是支持基本SQL功能的一个通用的应用程序编E接口,它在不同的数据库功能模块的层ơ上提供了一个统一的用L(fng)面,为对异构数据库进行直接的Web讉K提供了新的解x案?JDBC已被来多的数据库厂商、连接厂商、Internet服务厂商?qing)应用程序编制者所支持?/div>

 



]]>
վ֩ģ壺 þùƷһ| Ʒާѡ2021| þþƷѿ| ˳þõӰվ| ֱӽѿƵվ| ޳aƬ߹ۿ| һëƬѹۿ| һɫþۺ޾Ʒ| һƵ| ۺɫӰ| þѾƷһ| аӰԺ߹ۿ| ԻƵ40Կ| ޹ۺ| ŮվɫƵѹ| AVպAVһ| ׾Ʒһ| ѾƷþþþþĻ| ӰԺ߹ۿ| Ѹ| լ| Ļվ| ҳվ߹ۿ| 츾Ļʮг| 114ëƬѹۿ| ޳avƬ롿| ޾Ʒ߹ۿ̬ͼ| վ߿| ŷպۺ| avר| | պƷרձ | Ļһȥ̨| ŮڵƵվ | | С豻| ޳AVƬ߹ۿWWW| þþþùɫAVѹۿɫ| 97Ƶ˰| þù޸ۿ| һeһƬ߲|