﻿<?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-&lt;font size="5"&gt;Web2.0学习园地&lt;/font&gt;-文章分类-SQL SERVER</title><link>http://www.blogjava.net/CrazyJava/category/28085.html</link><description>&lt;marquee behavior="alternate" scrolldelay=3 scrollamount=3&gt;
&lt;font face="楷体_GB2312" color="#FFFF00" size="4"&gt;网络无所不在,信息无所不在,应用无所不在!&lt;/font&gt;
&lt;/marquee&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 14 Dec 2007 03:59:00 GMT</lastBuildDate><pubDate>Fri, 14 Dec 2007 03:59:00 GMT</pubDate><ttl>60</ttl><item><title>Java中调用SQL Server存储过程示例</title><link>http://www.blogjava.net/CrazyJava/articles/167562.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167562.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167562.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167562.html</trackback:ping><description><![CDATA[最近做了个Java的小项目（第一次写Java的项目哦）， 到网上搜索了半天，找到了一个比较好点的调用存储过程的例子，而且网上普遍采用的都是setXXX((int parameterIndex, XXX x)的形式。这种形式感觉不是很直观，下面就发布一个完整的采用setXXX(String parameterName, XXX x)的编写方法。创建数据表，存储过程的代码都完整发布。 <br />
<br />
　　创建表：<br />
<br />
<table width="90%" align="center" bgcolor="#d8d7d3">
    <tbody>
        <tr>
            <td>
            <div><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">BookUser</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;(<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">UserID</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">int</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">IDENTITY</span><span style="color: #000000">&nbsp;(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">UserName</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">varchar</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">)&nbsp;COLLATE&nbsp;Chinese_PRC_CI_AS&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Title</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">nvarchar</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">)&nbsp;COLLATE&nbsp;Chinese_PRC_CI_AS&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Guid</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">uniqueidentifier</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">DF_BookUser_Guid</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">DEFAULT</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff00ff">newid</span><span style="color: #000000">()),<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">BirthDate</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">datetime</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Description</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">ntext</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;COLLATE&nbsp;Chinese_PRC_CI_AS&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Photo</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">image</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">Other</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">varchar</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">)&nbsp;COLLATE&nbsp;Chinese_PRC_CI_AS&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">CONSTRAINT<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #ff0000">[</span><span style="color: #ff0000">DF_BookUser_Other</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">DEFAULT</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">默认值</span><span style="color: #ff0000">'</span><span style="color: #000000">),<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">PK_BookUser</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">PRIMARY</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">KEY</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">CLUSTERED</span><span style="color: #000000">&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;(<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">UserID</span><span style="color: #ff0000">]</span><span style="color: #000000"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;</span><span style="color: #0000ff">ON</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">PRIMARY</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;<br />
            )&nbsp;</span><span style="color: #0000ff">ON</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">PRIMARY</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;TEXTIMAGE_ON&nbsp;</span><span style="color: #ff0000">[</span><span style="color: #ff0000">PRIMARY</span><span style="color: #ff0000">]</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">GO</span><span style="color: #000000"><br />
            </span></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　创建存储过程：<br />
<br />
<table width="90%" align="center" bgcolor="#d8d7d3">
    <tbody>
        <tr>
            <td>
            <div><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">PROCEDURE</span><span style="color: #000000">&nbsp;InsertUser<br />
            </span><span style="color: #008000">@UserName</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">),<br />
            </span><span style="color: #008000">@Title</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),<br />
            </span><span style="color: #008000">@Guid</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">uniqueidentifier</span><span style="color: #000000">,<br />
            </span><span style="color: #008000">@BirthDate</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">DateTime</span><span style="color: #000000">,<br />
            </span><span style="color: #008000">@Description</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">ntext</span><span style="color: #000000">,<br />
            </span><span style="color: #008000">@Photo</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">image</span><span style="color: #000000">,<br />
            </span><span style="color: #008000">@Other</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">nvarchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">50</span><span style="color: #000000">),<br />
            </span><span style="color: #008000">@UserID</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">&nbsp;output&nbsp;<br />
            </span><span style="color: #0000ff">As</span><span style="color: #000000"><br />
            <br />
            </span><span style="color: #0000ff">Set</span><span style="color: #000000">&nbsp;NOCOUNT&nbsp;</span><span style="color: #0000ff">ON</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">If</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">Exists</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;UserID&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;BookUser&nbsp;</span><span style="color: #0000ff">Where</span><span style="color: #000000">&nbsp;UserName&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@UserName</span><span style="color: #000000">)<br />
            </span><span style="color: #0000ff">RETURN</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">ELSE</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">Begin</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;BookUser&nbsp;(UserName,Title,Guid,BirthDate,Description,Photo,Other)&nbsp;</span><span style="color: #0000ff">VALUES</span><span style="color: #000000">(</span><span style="color: #008000">@UserName</span><span style="color: #000000">,</span><span style="color: #008000">@Title</span><span style="color: #000000">,</span><span style="color: #008000">@Guid</span><span style="color: #000000">,</span><span style="color: #008000">@BirthDate</span><span style="color: #000000">,</span><span style="color: #008000">@Description</span><span style="color: #000000">,</span><span style="color: #008000">@Photo</span><span style="color: #000000">,</span><span style="color: #008000">@Other</span><span style="color: #000000">)<br />
            </span><span style="color: #0000ff">SET</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@UserID</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #008000">@@IDENTITY</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">RETURN</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">End</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">GO</span><span style="color: #000000"><br />
            </span></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　JSP代码：<br />
<br />
<table width="90%" align="center" bgcolor="#d8d7d3">
    <tbody>
        <tr>
            <td>＜%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%＞<br />
            ＜%@ page import = "java.sql.*"%＞<br />
            ＜!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"＞<br />
            ＜html xmlns="http://www.w3.org/1999/xhtml"＞<br />
            ＜head＞<br />
            ＜/head＞<br />
            ＜body＞<br />
            ＜%<br />
            //注意：下面的连接方法采用最新的SQL Server的JDBC，<br />
            //请到 http://msdn2.microsoft.com/zh-cn/data/aa937724.aspx 下载<br />
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");<br />
            String url="jdbc:sqlserver://localhost:1433;databaseName=Book;user=sa;password="; <br />
            String sql = "{? = call InsertUser(?,?,?,?,?,?,?,?)}"; <br />
            Connection cn = null;<br />
            CallableStatement cmd = null;<br />
            try<br />
            {<br />
            　cn = DriverManager.getConnection(url);<br />
            　cmd = cn.prepareCall(sql);<br />
            　java.util.UUID Guid = java.util.UUID.randomUUID();<br />
            　String FilePath = application.getRealPath("") + "testlogo.gif";<br />
            　java.io.FileInputStream f = new java.io.FileInputStream(FilePath); <br />
            　Date rightNow = Date.valueOf("2007-9-9");<br />
            　cmd.setString("UserName","mengxianhui"); //注意修改这里，存储过程验证了UserName的唯一性。<br />
            　cmd.setString("Title","孟宪会");<br />
            　cmd.setString("Guid",Guid.toString());<br />
            　cmd.setString("BirthDate","2007-9-9");<br />
            　cmd.setDate("BirthDate",rightNow);<br />
            　cmd.setString("Description","【孟子E章】");<br />
            　cmd.setBinaryStream("Photo",f,f.available());<br />
            　cmd.setString("Other",null);<br />
            　cmd.registerOutParameter(1,java.sql.Types.INTEGER);<br />
            　cmd.registerOutParameter("UserID",java.sql.Types.INTEGER);<br />
            　cmd.execute();<br />
            　int returnValue = cmd.getInt(1);<br />
            　int UserID = cmd.getInt("UserID");<br />
            　if(returnValue == 1)<br />
            　{<br />
            　　out.print("＜li＞添加成功！");<br />
            　　out.print("＜li＞UserID = " + UserID);<br />
            　　out.print("＜li＞returnValue = " + returnValue);<br />
            　}<br />
            　else<br />
            　<br />
            　f.close();<br />
            }<br />
            catch(Exception ex)<br />
            <br />
            finally<br />
            {<br />
            　try<br />
            　{<br />
            　　if(cmd != null)　<br />
            　　{<br />
            　　　cmd.close();<br />
            　　　cmd = null;<br />
            　　}<br />
            　　if(cn != null)<br />
            　　{<br />
            　　　cn.close();<br />
            　　　cn = null;<br />
            　　}<br />
            　}<br />
            　catch(Exception e)<br />
            　<br />
            }<br />
            %＞<br />
            ＜/body＞<br />
            ＜/html＞</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 17:32 <a href="http://www.blogjava.net/CrazyJava/articles/167562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server存储过程命名标准</title><link>http://www.blogjava.net/CrazyJava/articles/167540.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167540.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167540.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167540.html</trackback:ping><description><![CDATA[<p>这个标准蓝图的存储过程命名方法只适用于SQL 内部，当创建一个新的存储过程，或者发现一个没有按照这个标准构造的存储过程，请使用这个标准。</p>
<p>　　注意：如果存储过程以sp_ 为前缀开始命名那么会运行的稍微的缓慢，这是因为SQL SERVER将首先查找系统存储过程，所以我们决不推荐使用sp_作为前缀。</p>
<p>　　句法：</p>
<p>　　存储过程的命名有这个的语法：</p>
<p>　　[proc] [MainTableName] By [FieldName(optional)] [Action]</p>
<p><br />
　　[ 1&nbsp; ]&nbsp; [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　2&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; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]　　[&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp; ]</p>
<p>　　[1] 所有的存储过程必须有前缀'proc'. 所有的系统存储过程都有前缀"sp_", 推荐不使用这样的前缀因为会稍微的减慢。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [2] 表名就是存储过程访问的对象。</p>
<p>　　[3] 可选字段名就是条件子句。 比如： procClientByCoNameSelect, procClientByClientIDSelect</p>
<p>　　[4] 最后的行为动词就是存储过程要执行的任务。</p>
<p>　　如果存储过程返回一条记录那么后缀是：Select</p>
<p>　　如果存储过程插入数据那么后缀是：Insert</p>
<p>　　如果存储过程更新数据那么后缀是：Update</p>
<p>　　如果存储过程有插入和更新那么后缀是：Save</p>
<p>　　如果存储过程删除数据那么后缀是：Delete</p>
<p>　　如果存储过程更新表中的数据 (ie. drop and create) 那么后缀是：Create</p>
<p>　　如果存储过程返回输出参数或0，那么后缀是：Output</p>
<p>　　例子：</p>
<p>　　一个仅仅返回一个输出参数的存储过程:</p>
<p>ALTER PROCEDURE procClientRateOutput <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @pstrClientID VARCHAR(6) = 'CABLE',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @pstrCategoryID VARCHAR(6) = '&lt;All&gt;',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @pstrEmpID VARCHAR(6)='AC',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @pdteDate datetime = '1996/1/1',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @curRate MONEY OUTPUT</p>
<p>AS</p>
<p>-- Description: Get the $Rate for this client and this employee <br />
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and this category from Table ClientRate</p>
<p>SET @curRate = (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT TOP 1 Rate <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM ClientRate <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE ClientID=@pstrClientID <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND EmpID=@pstrEmpID <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND CategoryID=@pstrCategoryID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND DateEnd &gt; @pdteDate<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY DateEnd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</p>
<p>IF @curRate IS NULL</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @curRate =<br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT TOP 1 Rate <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM ClientRate <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE ClientID=@pstrClientID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND EmpID=@pstrEmpID <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND CategoryID='&lt;ALL&gt;' <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND DateEnd &gt; @pdteDate <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY DateEnd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</p>
<p>RETURN</p>
<p>&nbsp;</p>
<p><br />
　　过时的风格：</p>
<p>　　Select 'procGetRate' or 'sp_GetRate' <br />
　　Insert 'procEmailMergeAdd' </p>
<p><br />
　　推荐的风格：</p>
<p>　　'procClientRateSelect' <br />
　　'procEmailMergeInsert' </p>
<p><br />
本篇文章来源于 站长资讯网 原文链接：http://sqlserver.chinahtml.com/2007/119639501517267.shtml</p>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 16:41 <a href="http://www.blogjava.net/CrazyJava/articles/167540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL SERVER数据库开发之存储过程应用</title><link>http://www.blogjava.net/CrazyJava/articles/167537.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167537.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167537.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167537.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message417209"><br />
序<br />
　　可能有不少朋友使用SQL SERVER做开发也已经有段日子，但还没有或者很少在项目中使用存储过程，或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时，就会发现存储过程给我们带来了好处了，修改方便，不能去改我们的应用程序，只需要改存储过程的内容，而且还可以使我们的程序速度得到提高。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">SQL SERVER 联机丛书中的定义：<br />
　　存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。<br />
　　可以创建一个过程供永久使用，或在一个会话中临时使用（局部临时过程），或在所有会话中临时使用（全局临时过程）。<br />
　　也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。</div>
</div>
<br />
　　要使用存储过程，首先我们必需熟悉一些基本的T-SQL语句，因为存储过程是由于一组T-SQL语句构成的，并且，我们需要了解一些关于函数、过程的概念，因为我们需要在应用程序中调用存储过程，就像我们调用应用程序的函数一样，不过调用的方法有些不同。<br />
<br />
　　下面我们来看一下存储过程的建立和使用方法。<br />
<br />
<strong>一、创建存储过程</strong><br />
<br />
　　和数据表一样，在使用之前我们需要创建存储过程，它的简明语法是：<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">CREATE PROC 存储过程名称<br />
&nbsp; &nbsp; [参数列表（多个以&#8220;,&#8221;分隔）]<br />
AS<br />
SQL 语句</div>
</div>
<br />
例：<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder"><font color="blue">CREATE PROC</font> upGetUserName<br />
@intUserId&nbsp; &nbsp; &nbsp; &nbsp; INT,<br />
@ostrUserName NVARCHAR(20) <font color="purple">OUTPUT</font>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 要输出的参数</font><br />
<font color="blue">AS</font><br />
BEGIN<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 将uName的值赋给 @ostrUserName 变量，即要输出的参数</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId<br />
END</div>
</div>
<br />
　　其中 CREATE PROC 语句（完整语句为CREATE PROCEDURE）的意思就是告诉SQL SERVER，现在需要建立一个存储过程，upGetUserName 就是存储过程名称，@intUserId 和 @ostrUserName 分别是该存储过程的两个参数，注意，在SQL SERVER中，所有用户定义的变量都以&#8220;<font color="red">@</font>&#8221;开头，<font color="purple">OUTPUT</font>关键字表示这个参数是用来输出的，<font color="blue">AS</font>之后就是存储过程内容了。只要将以上代码在&#8220;查询分析器&#8221;里执行一次，SQL SERVER就会在当前数据库中创建一个名为&#8220;upGetUserName&#8221;的存储过程。你可以打开&#8220;企业管理器&#8221;，选择当前操作的数据库，然后在左边的树型列表中选择&#8220;存储过程&#8221;，此时就可以在右边的列表中看到你刚刚创建的存储过程了（如果没有，刷新一下即可）。<br />
<br />
<strong>二、存储过程的调用</strong><br />
<br />
　　之前我们已经创建了一个名为&#8220;upGetUserName&#8221;的存储过程，从字面理解该存储过程的功能是用来取得某一个用户的名称。存储过程建立好了，接下来就是要在应用程序里调用了，下面看一下在ASP程序里的调用。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">Dim adoComm<br />
<font color="green">'// 创建一个对象，我们用来调用存储过程</font><br />
Set adoComm = CreateObject("ADODB.Command")<br />
With adoComm<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .ActiveConnection = adoConn<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 类型为存储过程，adCmdStoredProc = 4</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandType = 4<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 存储过程名称</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandText = "upGetUserName"<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置用户编号</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Parameters.Item("@intUserId").Value = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 执行存储过程</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Execute<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 取得从存储过程返回的用户名称</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; Response.Write "用户名：" &amp; .Parameters.Item("@ostrUserName").Value<br />
End With<br />
<font color="green">'// 释放对象</font><br />
Set adoComm = Nothing</div>
</div>
<br />
　　通过以上两步，我们已经可以创建和使用简单的存储过程了。下面我们来看一个稍微复杂点的存储过程，以进一步了解存储过程的应用。<br />
<br />
<strong>三、存储过程的实际应用</strong><br />
<br />
　　用户登录在ASP项目中经常会使用到，相信很多朋友也都做过类似的系统，但使用存储过程来做验证朋友可能不多，那么我们就以它来做例子，写一个简单的用户登录验证的存储过程。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">CREATE PROC upUserLogin<br />
@strLoginName&nbsp; &nbsp; &nbsp; &nbsp; NVARCHAR(20),<br />
@strLoginPwd&nbsp; &nbsp; &nbsp; &nbsp; NVARCHAR(20),<br />
@blnReturn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BIT OUTPUT<br />
AS<br />
<font color="green">-- 定义一个临时用来保存密码的变量</font><br />
<font color="blue">DECLARE</font> @strPwd NVARCHAR(20)<br />
BEGIN<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 从表中查询当前用户的密码，赋值给 @strPwd 变量，下面要对他进行比较</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT @strPwd=uLoginPwd FROM uUser WHERE uLoginName=@strLoginName<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; IF @strLoginPwd = @strPwd<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <font color="blue">BEGIN</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @blnReturn = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 更新用户最后登录时间</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UPDATE uUser SET uLastLogin=GETDATE() WHERE uLoginName=@strLoginName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <font color="blue">END</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; ELSE<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @blnReturn = 0<br />
END</div>
</div>
<br />
　　用户登录的存储过程建立好了，现在在程序里试一下吧。注意，在一个区域内如果有多条语句时，必需使用<font color="blue">BEGIN...END</font>关键字。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">Dim adoComm<br />
<font color="green">'// 创建一个对象，我们用来调用存储过程</font><br />
Set adoComm = CreateObject("ADODB.Command")<br />
With adoComm<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .ActiveConnection = adoConn<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 类型为存储过程，adCmdStoredProc = 4</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandType = 4<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 存储过程名称</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandText = "upUserLogin"<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置登录名称</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Parameters.Item("@strLoginName").Value = "admin"<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置登录密码</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Parameters.Item("@strLoginPwd").Value = "123456"<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 执行存储过程</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Execute<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 判断是否登录成功</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; If .Parameters.Item("@blnReturn").Value = 1 Then<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Response.Write "恭喜你，登录成功！"<br />
&nbsp; &nbsp; &nbsp; &nbsp; Else<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Response.Write "不是吧，好像错了哦。。。"<br />
&nbsp; &nbsp; &nbsp; &nbsp; End If<br />
End With<br />
<font color="green">'// 释放对象</font><br />
Set adoComm = Nothing</div>
</div>
<br />
　　通过以上的步骤，简单用户登录验证过程也做完了，现在只要把它整合到程序中就可以实现简单的用户登录验证了，关于其他细节就由你自己来处理了。<br />
　　上面介绍的两个存储过程都是只返回一个值的，下面我们来看一个返回一个记录集的存储过程。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">CREATE PROC upGetUserInfos<br />
@intUserGroup&nbsp; &nbsp; &nbsp; &nbsp; INT<br />
AS<br />
BEGIN<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 从数据库中抽取符合条件的数据</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT uName,uGroup,uLastLogin FROM uUser WHERE uGroup=@intUserGroup<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">-- 插入一列合计</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; UNION<br />
&nbsp; &nbsp; &nbsp; &nbsp; SELECT '合计人数:',COUNT(uGroup),NULL FROM uUser WHERE uGroup=@intUserGroup<br />
END</div>
</div>
<br />
　　现在我们来看一下ASP程序的调用。<br />
<br />
<div class="msgbody">
<div class="msgheader">QUOTE:</div>
<div class="msgborder">Dim adoComm<br />
Dim adoRt<br />
<font color="green">'// 创建一个对象，我们用来调用存储过程</font><br />
Set adoComm = CreateObject("ADODB.Command")<br />
Set adoRs = CreateObject("ADODB.Recordset")<br />
With adoComm<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .ActiveConnection = adoConn<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 类型为存储过程，adCmdStoredProc = 4</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandType = 4<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 存储过程名称</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .CommandText = "upGetUserInfos"<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 设置用户组</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; .Parameters.Item("@intUserGroup").Value = 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 执行存储过程，和以上几个例子不同，这里使用RecordSet的Open方法</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; adoRs.<font color="blue">Open</font> adoComm<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="green">'// 显示第一个值</font><br />
&nbsp; &nbsp; &nbsp; &nbsp; Response.write adoRs.Fields(0).Value<br />
End With<br />
<font color="green">'// 释放对象</font><br />
Set adoRs = Nothing<br />
Set adoComm = Nothing</div>
</div>
<br />
　　怎么样，是不是也很简单呢，不过存储过程的用处不仅仅只有这些，他还有更强大的功能，比如使用游标、临时表来从多个表，甚至是多个数据库中调用数据，然后返回给用户，这些你可以在使用过程中慢慢的去发掘。<br />
<br />
</div>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 16:36 <a href="http://www.blogjava.net/CrazyJava/articles/167537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 存储过程的分页方案比拼</title><link>http://www.blogjava.net/CrazyJava/articles/167513.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167513.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167513.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167513.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp;
<p>SQL Server 存储过程的分页，这个问题已经讨论过几年了，很多朋友在问我，所以在此发表一下我的观点<br />
建立表：</p>
<p>CREATE TABLE [TestTable] (<br />
&nbsp;[ID] [int] IDENTITY (1, 1) NOT NULL ,<br />
&nbsp;[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,<br />
&nbsp;[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,<br />
&nbsp;[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,<br />
&nbsp;[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL <br />
) ON [PRIMARY]<br />
GO</p>
<p>&nbsp;</p>
<p>插入数据：(2万条，用更多的数据测试会明显一些)<br />
SET IDENTITY_INSERT TestTable ON</p>
<p>declare @i int<br />
set @i=1<br />
while @i&lt;=20000<br />
begin<br />
&nbsp;&nbsp;&nbsp; insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')<br />
&nbsp;&nbsp;&nbsp; set @i=@i+1<br />
end</p>
<p>SET IDENTITY_INSERT TestTable OFF</p>
<p>&nbsp;</p>
<p>-------------------------------------</p>
<p>分页方案一：(利用Not In和SELECT TOP分页)<br />
语句形式：<br />
SELECT TOP 10 *<br />
FROM TestTable<br />
WHERE (ID NOT IN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT TOP 20 id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM TestTable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY id))<br />
ORDER BY ID</p>
<p><br />
SELECT TOP 页大小 *<br />
FROM TestTable<br />
WHERE (ID NOT IN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT TOP 页大小*页数 id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY id))<br />
ORDER BY ID</p>
<p>-------------------------------------</p>
<p>分页方案二：(利用ID大于多少和SELECT TOP分页）<br />
语句形式：<br />
SELECT TOP 10 *<br />
FROM TestTable<br />
WHERE (ID &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT TOP 20 id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM TestTable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY id) AS T))<br />
ORDER BY ID</p>
<p><br />
SELECT TOP 页大小 *<br />
FROM TestTable<br />
WHERE (ID &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SELECT MAX(id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM (SELECT TOP 页大小*页数 id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM 表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY id) AS T))<br />
ORDER BY ID</p>
<p><br />
-------------------------------------</p>
<p>分页方案三：(利用SQL的游标存储过程分页)<br />
create&nbsp; procedure XiaoZhengGe<br />
@sqlstr nvarchar(4000), --查询字符串<br />
@currentpage int,&nbsp;--第N页<br />
@pagesize int&nbsp;--每页行数<br />
as<br />
set nocount on<br />
declare @P1 int,&nbsp;--P1是游标的id<br />
&nbsp;@rowcount int<br />
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output<br />
select ceiling(<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#46;&#48;&#42;&#64;&#114;&#111;&#119;&#99;&#111;&#117;&#110;&#116;&#47;&#64;&#112;&#97;&#103;&#101;&#115;&#105;&#122;&#101;">1.0*@rowcount/@pagesize</a>) as 总页数--,@rowcount as 总行数,@currentpage as 当前页&nbsp;<br />
set @currentpage=(@currentpage-1)*@pagesize+1<br />
exec sp_cursorfetch @P1,16,@currentpage,@pagesize <br />
exec sp_cursorclose @P1<br />
set nocount off</p>
<p>其它的方案：如果没有主键，可以用临时表，也可以用方案三做，但是效率会低。<br />
建议优化的时候，加上主键和索引，查询效率会提高。</p>
<p>通过SQL 查询分析器，显示比较：我的结论是:<br />
分页方案二：(利用ID大于多少和SELECT TOP分页）效率最高，需要拼接SQL语句<br />
分页方案一：(利用Not In和SELECT TOP分页)&nbsp;&nbsp; 效率次之，需要拼接SQL语句<br />
分页方案三：(利用SQL的游标存储过程分页)&nbsp;&nbsp;&nbsp; 效率最差，但是最为通用</p>
<p>在实际情况中，要具体分析。</p>
<p><br />
更多的讨论见：<br />
<a href="http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515">http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515</a></p>
</span>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 15:43 <a href="http://www.blogjava.net/CrazyJava/articles/167513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也说sqlserver分页查询</title><link>http://www.blogjava.net/CrazyJava/articles/167481.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167481.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167481.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167481.html</trackback:ping><description><![CDATA[<p><font size="2">现在一般常用的有以下2种方法:</font></p>
<p><font size="2">1. select top @pagesize * from table1 where id not in &nbsp;(select top @pagesize*(@page-1) id &nbsp;from table1 order by id) order by id</font></p>
<p><font size="2">2. select *&nbsp; from (select top @pagesize * from (select top @pagesize*@page * from table1 order by id) a order by id desc) b order by id</font></p>
<p><font size="2">哪种方法更好?试了一下.</font></p>
<p><font size="2">做两个table,各有1万条记录,一个table的id有index,一个没有</font></p>
<p><font size="2">图1,没有index的table,取第1000-1100条记录</font></p>
<p><font size="2"></font></p>
<p><font size="2">图2,没有index的table,取第9000-9100条记录</font></p>
<p><font size="2"></font></p>
<p><font size="2">图3,有index,取第1000-1100条记录</font></p>
<p><font size="2"></font></p>
<p><font size="2">图4,有index,取第9000-9100条记录</font></p>
<p><font size="2"></font></p>
<p><font size="2">可以发现sort的字段建立了index的条件下,第1个方法快很多,特别是查到后面页数的时候.原因就在于第2个方法中,第一次做了select 后,再做自查询时,index已经没有了.sort就会非常影响性能了.</font></p>
</span>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 14:04 <a href="http://www.blogjava.net/CrazyJava/articles/167481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用一句SQL取出第 m 条到第 n 条记录的方法</title><link>http://www.blogjava.net/CrazyJava/articles/167480.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167480.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167480.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167480.html</trackback:ping><description><![CDATA[<span class="t18">1 --从Table 表中取出第 m 条到第 n 条的记录：(Not In 版本)<br />
2 <br />
3 SELECT TOP n-m+1 * <br />
4 FROM Table <br />
5 WHERE (id NOT IN (SELECT TOP m-1 id FROM Table )) <br />
6 <br />
7 <br />
8 --从TABLE表中取出第m到n条记录 (Exists版本)<br />
9 <br />
10 SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists<br />
11 (Select * From (Select Top m-1 * From TABLE order by id) b Where b.id=a.id ) <br />
12 Order by id<br />
13 <br />
14 <br />
15 --m为上标，n为下标,例如取出第8到12条记录,m=8,n=12,Table为表名<br />
16 <br />
17 Select Top n-m+1 * From Table <br />
18 Where Id&gt;(Select Max(Id) From <br />
19 (Select Top m-1 Id From Table Order By Id Asc) Temp) <br />
20 Order By Id Asc </span>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 14:01 <a href="http://www.blogjava.net/CrazyJava/articles/167480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLServer分页查询通用存储过程</title><link>http://www.blogjava.net/CrazyJava/articles/167477.html</link><dc:creator>CrazyJava</dc:creator><author>CrazyJava</author><pubDate>Thu, 13 Dec 2007 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/CrazyJava/articles/167477.html</guid><wfw:comment>http://www.blogjava.net/CrazyJava/comments/167477.html</wfw:comment><comments>http://www.blogjava.net/CrazyJava/articles/167477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/CrazyJava/comments/commentRss/167477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/CrazyJava/services/trackbacks/167477.html</trackback:ping><description><![CDATA[<span class="t18">&nbsp;
<p>自开始做项目以来，一直在用。这段存储过程的的原创者（SORRY，忘记名字了），写得这段SQL代码很不错，我在这个基础上，按照我的习惯以及思维方式，调整了代码，只做分页查询用。</p>
<p>/**//*----------------------------------------------<br />
*procedure name : prcPageResult<br />
* author : FuChun<br />
* create date : 2006-10-04<br />
*/<br />
CREATE PROCEDURE prcPageResult<br />
-- 获得某一页的数据 --<br />
@currPage int = 1, --当前页页码 (即Top currPage)<br />
@showColumn varchar(2000) = '*', --需要得到的字段 (即 column1,column2,......)<br />
@tabName varchar(2000), --需要查看的表名 (即 from table_name)<br />
@strCondition varchar(2000) = '', --查询条件 (即 where condition......) 不用加where关键字<br />
@ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc)<br />
@bitOrderType bit = 0, --排序的类型 (0为升序,1为降序)<br />
@pkColumn varchar(50) = '', --主键名称<br />
@pageSize int = 20 --分页大小</p>
<p>AS<br />
BEGIN -- 存储过程开始<br />
-- 该存储过程需要用到的几个变量 <a href="http://www.knowsky.com/">http://www.knowsky.com/</a> --<br />
DECLARE @strTemp varchar(1000)<br />
DECLARE @strSql varchar(4000) --该存储过程最后执行的语句<br />
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)</p>
<p>BEGIN<br />
IF @bitOrderType = 1 -- bitOrderType=1即执行降序<br />
BEGIN<br />
SET @strOrderType = ' ORDER BY <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#97;&#115;&#99;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@ascColumn+'</a> DESC'<br />
SET @strTemp = '&lt;(SELECT min'<br />
END<br />
ELSE<br />
BEGIN<br />
SET @strOrderType = ' ORDER BY <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#97;&#115;&#99;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@ascColumn+'</a> ASC'<br />
SET @strTemp = '&gt;(SELECT max'<br />
END</p>
<p>IF @currPage = 1 -- 如果是第一页<br />
BEGIN<br />
IF @strCondition != ''<br />
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#104;&#111;&#119;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@showColumn+'</a> FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;">'+@tabName</a>+<br />
' WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#116;&#114;&#67;&#111;&#110;&#100;&#105;&#116;&#105;&#111;&#110;&#43;&#64;&#115;&#116;&#114;&#79;&#114;&#100;&#101;&#114;&#84;&#121;&#112;&#101;">'+@strCondition+@strOrderType</a><br />
ELSE<br />
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#104;&#111;&#119;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@showColumn+'</a> FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;&#43;&#64;&#115;&#116;&#114;&#79;&#114;&#100;&#101;&#114;&#84;&#121;&#112;&#101;">'+@tabName+@strOrderType</a><br />
END</p>
<p>ELSE -- 其他页<br />
BEGIN<br />
IF @strCondition !=''<br />
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#104;&#111;&#119;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@showColumn+'</a> FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;">'+@tabName</a>+<br />
' WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#116;&#114;&#67;&#111;&#110;&#100;&#105;&#116;&#105;&#111;&#110;&#43;&#39;">'+@strCondition+'</a> AND <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#64;&#115;&#116;&#114;&#84;&#101;&#109;&#112;&#43;&#39;&#40;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;&#41;&#39;&#43;&#39;">'+@pkColumn+@strTemp+'('+@pkColumn+')'+'</a> FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+<br />
' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@pkColumn+'</a> FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;&#43;&#64;&#115;&#116;&#114;&#79;&#114;&#100;&#101;&#114;&#84;&#121;&#112;&#101;&#43;&#39;">'+@tabName+@strOrderType+'</a>) AS TabTemp)'+@strOrderType<br />
ELSE<br />
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#115;&#104;&#111;&#119;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;">'+@showColumn+'</a> FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;">'+@tabName</a>+<br />
' WHERE <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#64;&#115;&#116;&#114;&#84;&#101;&#109;&#112;&#43;&#39;&#40;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;&#43;&#39;&#41;&#39;&#43;&#39;">'+@pkColumn+@strTemp+'('+@pkColumn+')'+'</a> FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#112;&#107;&#67;&#111;&#108;&#117;&#109;&#110;">'+@pkColumn</a>+<br />
' FROM <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;&#43;&#64;&#115;&#116;&#114;&#79;&#114;&#100;&#101;&#114;&#84;&#121;&#112;&#101;&#43;&#39;">'+@tabName+@strOrderType+'</a>) AS TabTemp)'+@strOrderType<br />
END</p>
<p>END<br />
EXEC (@strSql)<br />
END -- 存储过程结束<br />
------------------------------------------------<br />
GO<br />
调用方法：</p>
<p>prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25</p>
<p>上面表示，查询表TableName的所有字段，前25条记录，因为是第一页，排序字段为CreateDate，降序排列，主键是PkID。这个存储过程的功能比较强大，用在项目中非常的适用。不信您可以试试看，尤其是在百万级数据上，他的优势就显露无疑了，当然，这段代码是可以转换成MySql中的存储过程的，不过，在这里就不给大家了，你们可以自己试着转换看看。</p>
<p>下面的存储过程查询表的记录数：</p>
<p>/**//*----------------------------------------------<br />
*procedure name : prcRowsCount<br />
* author : FuChun<br />
* create date : 2006-09-22<br />
*/<br />
CREATE PROC prcRowsCount<br />
@tabName varchar(200), --需要查询的表名<br />
@colName varchar(200)='*', --需要查询的列名<br />
@condition varchar(200)='' --查询条件<br />
AS<br />
BEGIN<br />
DECLARE @strSql varchar(255)<br />
IF @condition = ''<br />
SET @strSql='select count(<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#99;&#111;&#108;&#78;&#97;&#109;&#101;&#43;&#39;">'+@colName+'</a>) from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;">'+@tabName</a><br />
ELSE<br />
SET @strSql='select count(<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#99;&#111;&#108;&#78;&#97;&#109;&#101;&#43;&#39;">'+@colName+'</a>) from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#97;&#98;&#78;&#97;&#109;&#101;&#43;&#39;">'+@tabName+'</a> where <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#99;&#111;&#110;&#100;&#105;&#116;&#105;&#111;&#110;">'+@condition</a><br />
EXEC (@strSql)<br />
END<br />
------------------------------------------------<br />
GO<br />
还有删除记录的通用存储过程和查询单条记录的通用存储过程在这里就不奉送了，感谢提供原通用分页查询存储过程的哥们，谢谢。<br />
<a href="http://blog.csdn.net/fcrpg2005/archive/2007/02/22/1512707.aspx">http://blog.csdn.net/fcrpg2005/archive/2007/02/22/1512707.aspx</a></p>
</span>
<img src ="http://www.blogjava.net/CrazyJava/aggbug/167477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/CrazyJava/" target="_blank">CrazyJava</a> 2007-12-13 13:58 <a href="http://www.blogjava.net/CrazyJava/articles/167477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>