﻿<?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-我的小船停在代码的海洋中...-随笔分类-SQL</title><link>http://www2.blogjava.net/machilansing/category/14192.html</link><description>Lansing--Coding 不是梦
</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 20:18:38 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 20:18:38 GMT</pubDate><ttl>60</ttl><item><title>关于ODBC数据源连接文本 </title><link>http://www.blogjava.net/machilansing/archive/2007/01/19/94895.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Fri, 19 Jan 2007 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2007/01/19/94895.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/94895.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2007/01/19/94895.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/94895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/94895.html</trackback:ping><description><![CDATA[关于ODBC数据源连接文本 <br /><br />            　　在《外部数据库的连接原理》一讲中我们说过，ODBC提供对多种数据库的支持，如dBase、Access、MS SQL <br />            Server及Oracle，也就是说运用ODBC数据源中所提供的连接代码，我们可以实现对多种数据库的连接。以连接Access数据库为例，ODBC数据源连接文本的格式是：<br />            　　“Driver={数据库驱动程序};Dbq=数据库文件;”<br />            　　在以上连接文本中，如果数据库跟程序在同一目录下，或者用变量DefaultDir指定了数据库所在目录，则数据库文件可以不用全路径名，如下即可：<br />            　　“ODBC;DBQ=MSAccess.mdb;Driver={Microsoft Access Driver (*.mdb)};”<br />            　　如下也可：<br />            　　“ODBC;DBQ=MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft <br />            Access Driver (*.mdb)};”<br />            　　如果数据库跟程序不在同一目录下，或者没有用变量DefaultDir指定数据库所在目录，则数据库文件需要用全路径名，如下：<br />            　　“ODBC;DBQ=E:\Quake III Arena\MSAccess.mdb;Driver={Microsoft Access <br />            Driver (*.mdb)};”<br />            　　以上所说的是连接Access数据库的格式，那么连接其他数据库的ODBC数据源连接文本又是怎样的？连接不同类型的数据库要使用不同的对应驱动程序，没忘记吧！不同的驱动程序当然它们的参数组合也就不同了，每一种不同驱动程序都有其特定的的参数形式： <br /><br />            　　⑴、MS Access ODBC DSNless 连接：<br />            　　☆、参数：Driver 设置值：{Microsoft Access Driver (*.mdb)}<br />            　　☆、参数：Dbq 设置值：实际路径文件名称<br />            　　☆、例句：<br />            　　“Driver={Microsoft Access Driver <br />            (*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass; ”<br />            　　⑵、dBase ODBC DSNless 连接： <br />            　　☆、参数：Driver 设置值：{Microsoft dBASE Driver (*.dbf)}<br />            　　☆、参数：Dbq 设置值：实际路径文件名称<br />            　　☆、例句：<br />            　　“Driver={Microsoft dBASE Driver <br />            (*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf; ”<br />            　　⑶、Oracle ODBC DSNless 连接：<br />            　　☆、参数：Driver 设置值：{Microsoft ODBC for Oracle}<br />            　　☆、参数：Dbq 设置值：实际路径文件名称<br />            　　☆、例句：<br />            　　“Driver={Microsoft ODBC for <br />            Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass; ”<br />            　　⑷、MS SQL Server DSNless 连接： <br />            　　☆、参数：Driver 设置值：{SQL Server};<br />            　　☆、参数：Server 设置值：服务器名称<br />            　　☆、参数：Database 设置值：数据表名称<br />            　　☆、参数：Uid 设置值：用户名称<br />            　　☆、参数：Pwd 设置值：密码<br />            　　☆、例句：<br />            　　“Driver={SQL <br />            Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass; ”<br />            　　⑸、MS Text Driver DSNless 连接： <br />            　　☆、参数：Driver 设置值：{Microsoft Text Driver (*.txt; *.csv)}<br />            　　☆、参数：Dbq 设置值：实际路径文件名称<br />            　　☆、例句：<br />            　　“Driver={Microsoft Text Driver (*.txt; <br />            *.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist Security <br />            Info=False; ”<br />            　　⑹、Visual Foxpro DSNless 连接：<br />            　　☆、参数：Driver 设置值：{Microsoft Visual FoxPro Driver}<br />            　　☆、参数：SourceType 设置值：DBC<br />            　　☆、参数：SourceDB 设置值：实际路径文件名称 <br />            　　☆、例句：<br />            　　“Driver={Microsoft Visual FoxPro <br />            Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;” <br /><br />            　　⑺、MySQL DSNless 连接：<br />            　　☆、参数：Driver 设置值：{mysql}<br />            　　☆、参数：database 设置值：数据表名称<br />            　　☆、参数：uid 设置值：用户名称<br />            　　☆、参数：pwd 设置值：密码<br />            　　☆、例句： <br />            　　“driver={mysql}; <br />            database=yourdatabase;uid=username;pwd=password;option=16386”<br />            *******************************************************************<br />            SQL语言简介 <br /><br />            　　在上一讲中我们介绍了连接外部数据库的方法，那么连接之后怎样对外部数据库进行读取、显示、增删、更新、查询等操作呢？这些操作需要通过外部数据库等对象调用SQL指令才能完成。<br />            　　㈠、什么是SQL语言<br />            　　SQL（Structure Query Languge，结构化查询语言）是一种数据库专用的计算机语言，不管是Oracle、MS <br />            SQL <br />            、Access、MySQL或其他公司的数据库，也不管数据库建立在大型主机或个人计算机上，都可以使用SQL语言来访问和修改数据库的内容。虽然不同公司的数据库软件多多少少会增加一些专属的SQL语法，但大体上，它们还是遵循ASNI（美国国家标准协会）制定的SQL标准。因为SQL语言具有易学习及阅读等特性，所以SQL逐渐被各种数据库厂商采用，而成为一种共通的标准查询语言。只要你学会SQL，即可操作各种数据库如Visual <br />            Foxpro、Access、dBase等等。总之，SQL语言是各种数据库都可以使用的数据库查询语言。<br />            　　SQL语言不仅仅具有查询数据库的功能，而且可以对数据库完成选取、增删、更新与跳转等各种操作。<br />            　　㈡、SQL语言的组成<br />            　　SQL语言是由命令（函数）、子句、运算符、加总函数及通配符等组成，分述如下：<br />            　　1、命令<br />            　　SQL的命令可分成数据定义语言与数据操作语言，数据定义语言可用来建立新的数据库、数据表、字段及索引等，本教程不予介绍；另一为数据操作语言，可用来建立查询表、排序、筛选数据、修改、增删等动作。数据定义语言命令常用的有选择、添加、删除和修改这四种：<br />            　　⑴、命令：SELECT<br />            　　中文意思：选择<br />            　　说明：用于找出合乎条件的记录<br />            　　⑵、命令：INSERT<br />            　　中文意思：插入<br />            　　说明：用于增加一笔记录或合并两个数据表<br />            　　⑶、命令：UPDATE<br />            　　中文意思：更新<br />            　　说明：用于更正合乎条件的记录<br />            　　⑷、命令：DELETE<br />            　　中文意思：删除<br />            　　说明：用于删除合乎条件的记录<br />            　　2、子句<br />            　　子句是用于设定命令要操作的对象（即参数），SQL所用的子句如下：<br />            　　⑴、子句：FROM <br />            　　中文意思：数据表<br />            　　说明：用于指定数据表<br />            　　⑵、子句：WHERE<br />            　　中文意思：条件<br />            　　说明：用于设定条件<br />            　　⑶、GROUP BY<br />            　　中文意思：分组（合并）<br />            　　说明：用于设定分组<br />            　　⑷、ORDER BY<br />            　　中文意思：排序<br />            　　说明：用于设定输出的顺序及字段<br />            　　3、运算符<br />            　　子句参数中的运算符使子句构成不同的语法格式，如“字段1='100'”、“字段1&gt;'100'”等。运算符又分逻辑运算符与比较运算符。<br />            　　◇逻辑运算符如下：<br />            　　⑴、运算符：AND<br />            　　中文意思：并且<br />            　　说明：逻辑且<br />            　　⑵、运算符：OR <br />            　　中文意思：或者<br />            　　说明：逻辑非<br />            　　⑶、运算符：NOT<br />            　　中文意思：取反<br />            　　说明：逻辑非或逻辑反<br />            　　◇比较运算符如下：<br />            　　⑴、运算符：&lt; 说明:小于<br />            　　⑵、运算符：≤ 说明：小于等于<br />            　　⑶、运算符：≥ 说明：大于等于<br />            　　⑷、运算符：&gt; 说明：大于<br />            　　⑸、运算符：= 说明：等于<br />            　　⑹、运算符：&lt;&gt; 说明：不等于<br />            　　⑺、运算符：BETWEEN 说明：用于设定范围 中文意思：在...之间<br />            　　⑻、运算符：LIKE 说明：用于通配设定 中文意思：如同<br />            　　⑼、运算符：IN 说明：用于集合设定 中文意思：在...之内<br />            　　4、加总函数<br />            　　加总函数常常运用在命令的参数中，如：“SELECT SUM（数学），AVG（数学） FROM 成绩单”。<br />            　　⑴、加总函数：AVG <br />            　　中文意思：平均<br />            　　说明：用于求指定条件的平均 <br />            　　⑵、加总函数：COUNT<br />            　　中文意思：数量<br />            　　说明：用于求指定的数量<br />            　　⑶、加总函数：SUM<br />            　　中文意思：和<br />            　　说明：用于求指定条件的和<br />            　　⑷、加总函数：MAX<br />            　　中文意思：最大值<br />            　　说明：用于求指定条件的最大值<br />            　　⑸、加总函数：MIN<br />            　　中文意思：最小值<br />            　　说明：用于求指定条件的最小值<br />            　　5、通配符<br />            　　⑴、通配符：% 意义：任何长度的字符串（包括0）<br />            　　⑵、通配符：_ 意义：下划线表示任何一个字符<br />            　　⑶、通配符：[] 意义：中括号表示某个范围内的一个字符<br />            　　在下一讲将说明SQL语言是怎样把命令（函数）、子句、运算符、及加总函数等组合在一起的。<br /><br />            *************************************************************************<br /><br />            嵌入式SQL的应用 <br /><br />            　　SQL语句可以单独在数据库系统本身中执行，但如果运用在其他编程工具所编制的程序中，一般不能单独执行，而要把SQL语句嵌入到高级语言（如易语言）中使用，通过高级语言的命令和方法来调用之，此时SQL称为嵌入式SQL。调用SQL语句的程序称为宿主程序，在易语言中一般是把SQL语句作为宿主程序的唯一参数来直接处理。嵌入式SQL在使用上有一些规定，在易语言中目前的版本规定如下：<br />            　　⑴、在程序中要区分SQL语句和宿主语言的语句。在易语言中好区分，因为SQL语句形式是英文的，而易语言是中文的，但在实际应用时仍然有可能会混乱，所以易语言要把SQL语句转化为文本型才能调用，即嵌入式SQL语句两边要用双引号来标示。<br />            　　⑵、允许SQL语句使用宿主程序的变量，但使用时要将宿主程序的变量跟外部数据库中表格的字段名区别开来，区别方法如下：<br />            　　①、在易语言中要将变量类型转化为文本型变量才能被SQL文本相加使用，比如下面的例子中有一个叫“数字1”的整数类型变量，插入到SQL文本中是这样表达：<br />            　　外部数据库1.查询 (“select * from chj where ” ＋ 组合框1.内容 ＋ “=” ＋ 到文本 (数字1))<br />            　　②、包含字段名的SQL文本两边加双引号，变量名不能在双引号内，如上例。<br />            　　⑶、要将字段名跟字段值区别开来，区别方法如下：<br />            　　①、对于文本类型的字段，在其字段值两边要加上“'”号标示其文本值，代表语法是：字段名称=‘文本值’。如下：<br />            　　外部数据库1.查询 (“select * from chj where 姓名='山大王'”)<br />            　　又如下面“查找编辑框.内容”中的字段值是文本型，嵌入式SQL语句如下：<br />            　　外部数据库1.查询 (“select * from chj where 姓名==” ＋ “'” ＋ 查找编辑框.内容 ＋ <br />“'”)<br />            　　②、对于数字类型的字段，在SQL语句中表示其字段值，两边不加符号标示，代表语法是：字段名称=数字值。如下两例：<br />            　　外部数据库1.查询 (“select * from chj where ” ＋ 组合框1.内容 ＋ “=” ＋ 查找编辑框.内容) <br />            　　外部数据库1.查询 (“select * from chj where 学号=17”)<br />            　　③、对于日期时间类型的字段，在其字段值两边要加上“#”号标示其时间值，代表语法是：字段名称=#时间值#。如下两例：<br />            　　外部数据库1.查询 (“select * from chj where 入学时间 BETWEEN #2001-01-01# and <br />            #2002-01-01#”)<br />            　　外部数据库1.查询 (“select * from chj where ” ＋ 组合框1.内容 ＋ “=” ＋ “#” ＋ <br />            查找编辑框.内容 ＋ “#”)<br />            　　④、也可以将SQL语句中的字段名（尤其是中文名）可用中括号括住，如：[字段名]。<br />            　　<br />            　　⑷、SQL语句要用半角输入法输入，否则可能会出错。<br />            　　那么在易语言中怎样调用SQL语句呢？一般是在外部数据库对象（控件）的方法中调用，试概括如下：<br />            　　⑴、对外部数据库进行查询的方法。<br />            　　对外部数据库的查询就是在对外部数据库不加编辑改动的前提下，只通过记录集来对数据库进行显示、查询、筛选、排序和记录集的合并等操作。<br />            　　所有查询类的方法起源于下面这个语句，其他查询类语句是对这个语句的调用（将此语句作为唯一的参数），该语句如下：<br />            　　外部数据库．查询 （查询类SQL语句）<br />            　　也可这样表达：<br />            　　外部数据库．查询 （“SELECT...FROM...[WHERE]...[GROUP BY]...[ORDER BY]... ”）<br />            　　该方法是对当前被打开数据库进行数据查询，返回的结果称为“记录集句柄”（即记录集的标记）。注意当不再使用此记录集时，必须使用“关闭记录集”将其关闭，如果失败，返回0。在易语言中，将以上语句等同于记录集句柄以作为其他查询类语句的参数。为了使该参数在所有子程序中都能应用，我们一般把它设置为整数型全局变量，并将其值设置如下：<br />            　　记录集句柄=外部数据库．查询 （查询类SQL语句）<br />            　　由于易语言要把SQL语句转化为文本型才能调用，所以嵌入式SQL语句两边要有双引号，例句：<br />            　　记录集句柄 ＝ 外部数据库1.查询 (“select * from chj ”)<br />            　　※ “chj”是外部数据库中一个表的名称<br />            　　又如，欲得到排序的记录集，应象下面这样赋值：<br />            　　记录集句柄 ＝ 外部数据库1.查询 (“SELECT * FROM chj ORDER BY 语文 DESC”)<br />            　　现将外部数据库控件中其他的查询类方法列举如下：<br />            　　①、外部数据库．重新查询 （记录集句柄） 即：<br />            　　外部数据库．重新查询 （外部数据库．查询 （查询类SQL语句））<br />            　　例句：外部数据库1.重新查询 (外部数据库1.查询 (“select * from chj ”)) <br />            　　②、外部数据库．首记录前 （记录集句柄） 即：<br />            　　外部数据库．首记录前 （外部数据库．查询 （查询类SQL语句））<br />            　　例句：外部数据库1.首记录前 (记录集句柄)<br />            　　③、外部数据库．尾记录后 （记录集句柄）<br />            　　④、外部数据库．到首记录 （记录集句柄）<br />            　　⑤、外部数据库．到尾记录 （记录集句柄）<br />            　　⑥、外部数据库．到前一记录 （记录集句柄）<br />            　　⑦、外部数据库．到后一记录 （记录集句柄）<br />            　　⑧、外部数据库．读 （记录集句柄，字段名称或位置）<br />            　　例句：语文编辑框.内容 ＝ 到文本 (外部数据库1.读 (记录集句柄, “语文”))<br />            　　⑵、对外部数据库进行编辑的方法。<br />            　　所谓对外部数据库的编辑，就是变更改动外部数据库本身，包括添加、更新、删除等，对数据库进行编辑不必通过记录集。所有非查询类SQL语句都嵌入下面这个语句来执行：<br />            　　外部数据库．执行 （非查询类SQL语句）<br />            　　①、添加记录，其语法如下：<br />            　　外部数据库．执行 （“insert into 表名称(字段1,字段2...) values (字段值1,字段值2...) ”）<br />            　　例句：<br />            　　外部数据库1.执行 (“INSERT INTO chj ” ＋ “(学号,姓名,语文,数学,英语)” ＋ “ valueS ” ＋ <br />            “(” ＋ 学号编辑框.内容 ＋ “,'” ＋ 姓名编辑框.内容 ＋ “','” ＋ 语文编辑框.内容 ＋ “','” ＋ <br />            数学编辑框.内容 ＋ “','” ＋ 英语编辑框.内容 ＋ “')”)<br />            　　②、更新记录，其语法如下：<br />            　　外部数据库．执行 （“UPDATE 表名称 SET 字段1=字段值1，字段2=字段值2...WHERE 条件式”） <br />            　　例句：<br />            　　外部数据库1.执行 (“UPDATE chj SET 学号=” ＋ “'” ＋ 学号编辑框.内容 ＋ “',” ＋ “姓名=” <br />            ＋ “'” ＋ 姓名编辑框.内容 ＋ “',” ＋ “语文=” ＋ “'” ＋ 语文编辑框.内容 ＋ “',” ＋ “数学=” <br />            ＋ “'” ＋ 数学编辑框.内容 ＋ “',” ＋ “英语=” ＋ “'” ＋ 英语编辑框.内容 ＋ “' ” ＋ “WHERE <br />            姓名=” ＋ “'” ＋ 姓名1 ＋ “' ” ＋ “AND 语文=” ＋ 语文1 ＋ “AND 数学=” ＋ 数学1 ＋ “AND <br />            英语=” ＋ 英语1 ＋ “AND 学号=” ＋ 学号1)<br />            　　③、删除记录，其语法如下：<br />            　　外部数据库．执行 （“DELETE * FROM 表名称 WHERE 条件式”）<br />            　　例句：<br />            　　外部数据库．执行 （“外部数据库1.执行 (“DELETE * FROM chj ” ＋ “WHERE 姓名=” ＋ “'” ＋ <br />            姓名1 ＋ “' ” ＋ “AND 语文=” ＋ 语文1 ＋ “AND 数学=” ＋ 数学1 ＋ “AND 英语=” ＋ 英语1 ＋ <br />            “AND 学号=” ＋ 学号1)”）<br /><img src ="http://www.blogjava.net/machilansing/aggbug/94895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2007-01-19 12:17 <a href="http://www.blogjava.net/machilansing/archive/2007/01/19/94895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批量处理JDBC语句提高处理速度</title><link>http://www.blogjava.net/machilansing/archive/2006/08/22/64956.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Tue, 22 Aug 2006 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/22/64956.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/64956.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/22/64956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/64956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/64956.html</trackback:ping><description><![CDATA[
		<table style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="700" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" height="25">
										<font face="黑体" size="4">批量处理JDBC语句提高处理速度</font>
								</td>
						</tr>
						<tr bgcolor="#f9f9f9">
								<td id="fontzoom" style="LINE-HEIGHT: 200%">
										<p align="center">作者：佚名    来自：未知</p>
										<p>
										</p>
										<p>　　有时候JDBC运行得不够快，这使得有些程序员使用数据库相关的存储过程。作为一个替代方案，可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高速度。 </p>
										<p>　　存储过程的最简单的形式就是包含一系列SQL语句的过程，将这些语句放在一起便于在同一个地方管理也可以提高速度。Statement 类可以包含一系列SQL语句，因此允许在同一个数据库事务执行所有的那些语句而不是执行对数据库的一系列调用。 </p>
										<p>　　使用批量处理功能涉及下面的两个方法：<br />　　· addBatch(String) 方法 <br />　　· executeBatch方法 </p>
										<p>　　如果你正在使用Statement 那么addBatch 方法可以接受一个通常的SQL语句，或者如果你在使用PreparedStatement ，那么也可以什么都不向它增加。executeBatch 方法执行那些SQL语句并返回一个int值的数组，这个数组包含每个语句影响的数据的行数。如果将一个SELECT语句或者其他返回一个ResultSet的SQL语句放入批量处理中就会导致一个SQLException异常。 </p>
										<p>　　关于java.sql.Statement 的简单范例可以是： </p>
										<p>　　Statement stmt = conn.createStatement();<br />　　stmt.insert("DELETE FROM Users");<br />　　stmt.insert("INSERT INTO Users VALUES("rod", 37, "circle")");<br />　　stmt.insert("INSERT INTO Users VALUES("jane", 33, "triangle")");<br />　　stmt.insert("INSERT INTO Users VALUES("freddy", 29, "square")");<br />　　int[] counts = stmt.executeBatch(); </p>
										<p>　　PreparedStatement 有些不同，它只能处理一部分SQL语法，但是可以有很多参数，因此重写上面的范例的一部分就可以得到下面的结果： </p>
										<p>　　// 注意这里没有DELETE语句<br />　　PreparedStatement stmt = conn.prepareStatement("INSERT INTO Users VALUES(?,?,?)");</p>
										<p>　　User[ ] users = ...;<br />　　for(int i=0; i&lt;users.length; i++) {<br />　　　stmt.setInt(1, users[i].getName());<br />　　　stmt.setInt(2, users[i].getAge());<br />　　　stmt.setInt(3, users[i].getShape());<br />　　　stmt.addBatch( );<br />　　}<br />　　int[ ] counts = stmt.executeBatch(); </p>
										<p>　　如果你不知道你的语句要运行多少次，那么这是一个很好的处理SQL代码的方法。在不使用批量处理的情况下，如果添加50个用户，那么性能就有影响，如果某个人写了一个脚本添加一万个用户，程序可能变得很糟糕。添加批处理功能就可以帮助提高性能，而且在后面的那种情况下代码的可读性也更好。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/machilansing/aggbug/64956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-22 09:24 <a href="http://www.blogjava.net/machilansing/archive/2006/08/22/64956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>全文索引—CONTAINS语法</title><link>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Thu, 17 Aug 2006 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/64048.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/64048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/64048.html</trackback:ping><description><![CDATA[
		<strong>全文索引—CONTAINS语法<br /><br /></strong>全文索引—CONTAINS语法<br />全文索引——CONTAINS 语法<br />我们通常在 WHERE 子句中使用 CONTAINS ，就象这样：SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 <br /><br />我们通过例子来学习，假设有表 students，其中的 address 是全文本检索的列。<br />1. 查询住址在北京的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'beijing' )<br />remark: beijing是一个单词，要用单引号括起来。<br /><br />2. 查询住址在河北省的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"HEIBEI province"' )<br />remark: HEBEI province是一个词组，在单引号里还要用双引号括起来。<br /><br />3. 查询住址在河北省或北京的学生<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )<br />remark: 可以指定逻辑操作符(包括 AND ，AND NOT，OR )。<br /><br />4. 查询有 '南京路' 字样的地址<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'nanjing NEAR road' )<br />remark: 上面的查询将返回包含 'nanjing road'，'nanjing east road'，'nanjing west road' 等字样的地址。<br />          A NEAR B，就表示条件： A 靠近 B。<br /><br />5. 查询以 '湖' 开头的地址<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, '"hu*"' )<br />remark: 上面的查询将返回包含 'hubei'，'hunan' 等字样的地址。<br />          记住是 *，不是 %。<br /><br />6. 类似加权的查询<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )<br />remark: ISABOUT 是这种查询的关键字，weight 指定了一个介于 0~1之间的数，类似系数(我的理解)。表示不同条件有不同的侧重。<br /><br />7. 单词的多态查询<br />SELECT student_id,student_name<br />FROM students<br />WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )<br />remark: 查询将返回包含 'street'，'streets'等字样的地址。<br />         对于动词将返回它的不同的时态，如：dry，将返回 dry，dried，drying 等等。<img src ="http://www.blogjava.net/machilansing/aggbug/64048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-17 09:31 <a href="http://www.blogjava.net/machilansing/archive/2006/08/17/CONTAINS.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程简介</title><link>http://www.blogjava.net/machilansing/archive/2006/08/11/62927.html</link><dc:creator>Lansing</dc:creator><author>Lansing</author><pubDate>Fri, 11 Aug 2006 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/machilansing/archive/2006/08/11/62927.html</guid><wfw:comment>http://www.blogjava.net/machilansing/comments/62927.html</wfw:comment><comments>http://www.blogjava.net/machilansing/archive/2006/08/11/62927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/machilansing/comments/commentRss/62927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/machilansing/services/trackbacks/62927.html</trackback:ping><description><![CDATA[
		<p>        定义：<br />          将常用的或很复杂的工作，预先用SQL语句写好并用一个指定的名称存储起来,   那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。<br />        讲到这里,可能有人要问：这么说存储过程就是一堆SQL语句而已啊？<br />          Microsoft公司为什么还要添加这个技术呢?<br />        那么存储过程与一般的SQL语句有什么区别呢?<br />        存储过程的优点：<br />          1.存储过程只在创造时进行编译，以后每次执行存储过程都不需再重新编译，而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。<br />          2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时），可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。<br />          3.存储过程可以重复使用,可减少数据库开发人员的工作量<br />          4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权<br />        存储过程的种类：<br />          1.系统存储过程：以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,<br />          如   sp_help就是取得指定对象的相关信息<br />          2.扩展存储过程   以XP_开头,用来调用操作系统提供的功能<br />          exec   master..xp_cmdshell   'ping   10.8.16.1'<br />          3.用户自定义的存储过程,这是我们所指的存储过程<br />          常用格式<br />          Create   procedure   procedue_name<br />          [@parameter   data_type][output]<br />          [with]{recompile|encryption}<br />          as<br />          sql_statement<br />        解释:   <br />        output：表示此参数是可传回的<br />        with   {recompile|encryption}<br />        recompile:表示每次执行此存储过程时都重新编译一次<br />        encryption:所创建的存储过程的内容会被加密<br />        如:<br />          表book的内容如下<br />          编号   书名   价格<br />          001   C语言入门   $30<br />          002   PowerBuilder报表开发   $52<br />          实例1:查询表Book的内容的存储过程<br />          create   proc   query_book<br />          as   <br />          select   *   from   book<br />          go<br />          exec   query_book<br />          实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额<br />          Create   proc   insert_book<br />          @param1   char(10),@param2   varchar(20),@param3   money,@param4   money   output<br />          with   encryption   ---------加密<br />          as<br />          insert   book(编号,书名，价格）   Values(@param1,@param2,@param3)<br />          select   @param4=sum(价格)   from   book<br />          go<br />          执行例子:   <br />          declare   @total_price   money   <br />          exec   insert_book   '003','Delphi   控件开发指南',$100,@total_price<br />          print   '总金额为'+convert(varchar,@total_price)<br />          go<br />        存储过程的3种传回值:<br />          1.以Return传回整数<br />          2.以output格式传回参数<br />          3.Recordset<br />        传回值的区别:<br />          output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中   <br />        实例3：设有两个表为Product,Order,其表内容如下：<br />          Product<br />          产品编号   产品名称   客户订数   <br />          001   钢笔   30   <br />          002   毛笔   50   <br />          003   铅笔   100   <br />          Order   <br />          产品编号   客户名   客户订金<br />          001   南山区   $30<br />          002   罗湖区   $50<br />          003   宝安区   $4<br />        请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,<br />        总金额=订金*订数,临时表放在存储过程中<br />        代码如下:<br />          Create   proc   temp_sale<br />          as<br />          select   a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数*   b.客户订金   as总金额<br />          into   #temptable   from   Product   a   inner   join   Order   b   on   a.产品编号=b.产品编号<br />          if   @@error=0   <br />          print   'Good'<br />          else<br />        &amp;n bsp; print   'Fail'<br />          go</p>
		<p>存储过程介绍   <br />一、先介绍一下什么是存储过程   <br />存储过程是利用SQL   Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL   Server提供专为设计数据库应用程序的语言，它是应用程序和SQL   Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix-4GL语言一样。这类语言主要提供以下功能，让用户可以设计出符合引用需求的程序：   <br />1)、变量说明   <br />2)、ANSI兼容的SQL命令(如Select,Update….)   <br />3)、一般流程控制命令(if…else…、while….)   <br />4)、内部函数   </p>
		<p>二、存储过程的书写格   </p>
		<p>CREATE   PROCEDURE   [拥有者.]存储过程名[;程序编号]   <br />[(参数#1,…参数#1024)]   <br />[WITH   <br />{RECOMPILE   |   ENCRYPTION   |   RECOMPILE,   ENCRYPTION}   <br />]   <br />[FOR   REPLICATION]   <br />AS   程序行   </p>
		<p>其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数   <br />(SQL   Server   7.0以上版本),参数的使用方法如下:   </p>
		<p>@参数名   数据类型   [VARYING]   [=内定值]   [OUTPUT]   </p>
		<p>每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外，其他SQL   Server所支持的数据类型都可使用。   <br />[=内定值]相当于我们在建立数据库时设定一个字段的默认值，这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的，也就是在调用了这个存储过程时，如果所指定的参数值是我们需要输入的参数，同时也需要在结果中输出的，则该项必须为OUTPUT，而如果只是做输出参数用，可以用CURSOR，同时在使用该参数时，必须指定VARYING和OUTPUT这两个语句。   </p>
		<p>例子:   <br />CREATE   PROCEDURE   order_tot_amt   @o_id   int,@p_tot   int   output   AS   <br />SELECT   @p_tot   =   sum(Unitprice*Quantity)   <br />FROM   orderdetails   <br />WHERE   <a href="mailto:ordered=@o_id">ordered=@o_id</a>   </p>
		<p>例子说明:   <br />该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表(orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序   </p>
		<p>三、在SQL   Server中执行存储过程   </p>
		<p>在SQL   Server的查询分析器中，输入以下代码:   <br />declare   @tot_amt   int   <br />execute   order_tot_amt   1,@tot_amt   output   <br />select   @tot_amt   </p>
		<p>以上代码是执行order_tot_amt这一存储过程，以计算出定单编号为1的定单销售金额，我们定义@tot_amt为输出参数，用来承接我们所要的结果  </p>
<img src ="http://www.blogjava.net/machilansing/aggbug/62927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/machilansing/" target="_blank">Lansing</a> 2006-08-11 10:25 <a href="http://www.blogjava.net/machilansing/archive/2006/08/11/62927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>