首页 > php与数据库

SELECT语句中“加锁选项”功能说明

SELECT 语句中“加锁选项”的功能说明
SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果。
 本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。
功能说明: 
NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。
 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。
HOLDLOCK(保持锁)
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
UPDLOCK(修改锁)
此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。
TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。
 这个选项保证其他进程只能读取而不能修改数据。
PAGLOCK(页锁)
此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
TABLOCKX(排它表锁)
此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(Transaction Isolation Level)。
 请查阅SQL Server 联机手册获取更多信息。

阅读全文

win98 PWS环境下连接读取远程SQLServer

from: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=4&txtCodeId=6518
Connect/Read Remote SQL server Using PWS in win 98
I had to test Microsoft's Personal Webserver (PWS) in win 98 to access Remote SQL server 7.0
installed in a NT server. The clients to win 98 had LAN connections. Easy one , don't vote, have fun with
PWS. In fact I tested my connection with this script, before I created an out of process server demo with
VB.





code:
Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!

Terms of Agreement:
By using this code, you agree to the following terms...
1) You may use this code in your own programs (and may compile it into a program and distribute it in
compiled format for langauges that allow it) freely and with no charge.
2) You MAY NOT redistribute this code (for example to a web site) without written permission from the
original author. Failure to do so is a violation of copyright laws.
3) You may link to this code from another website, but ONLY if it is not wrapped in a frame.
4) You will abide by any additional copyright restrictions which the author may have placed in the code or
code's description.

'**************************************
' Name: Connect/Read Remote SQL server U
' sing PWS in win 98
' Description:I had to test Microsoft's
' Personal Webserver (PWS) in win 98 to ac
' cess Remote SQL server 7.0 installed in
' a NT server. The clients to win 98 had L
' AN connections. Easy one , don't vote, h
' ave fun with PWS. In fact I tested my co
' nnection with this script, before I crea
' ted an out of process server demo with V
' B.
' By: Manas Mukherjee
'

阅读全文

在ACCESS 中调用后台存储过程

ACCESS是一个Client/Server的优秀前端开发工具,具有易学易用,界面友好,开发简单,和其他数据库接口灵活。但是,它要对大量数据处理时,速度比较慢。深圳供电局现有60万用户,下面有6个营业所,通过64K DDN 和局相连,如果有一个营业所要对1万用户进行处理的话,要花2~3小时,严重影响其他业务的开展。所以,当有大量数据需要处理时,不能在Client端处理,而必须在Server端处理。
 但ACCESS和Server端之间多数通过ODBC来连接,这样就增加了调用后台存储过程的难度。笔者通过在实际工作中长期的摸索,根据不同的业务需要,可以用下面三种方法去调用后台存储过程。
  一、 Access 向后台提交作业,这一个个作业对应一个个的存储过程。在SQL Server 6.5中,通过Task Manager 来建立相应的Task; 而在Oracle 8.0中,通过Managing Job Queue 来建立相应的Job。在Access中,在job_list表中插入一个作业,这些作业一般每天晚上运行一次。这些作业对应的业务一般是需要处理非常大量数据,而实时性又是较低的,在我们的业务中比较典型的例子是每天晚上大量的电费计算。
  二、 在Server端建立一些触发器(Trigger),在Access中激活这些触发器。在SQL Server 6.5 和Oracle 8.0中,都是通过Create Trigger 来实现。在Access中,根据不同的业务,通过插入、修改、删除记录来激活不同触发器。在我们的业务中一个例子是,当业务人员修改用户的电表读数后,激活计算电费的触发器,能立即重新计算该用户的电费。这样子,既可以和批量计算电费共享同一程序,不用在Access端重新开发,有可以加快前端的响应速度。
  三、 以上二种方法,只可以说是间接调用后台存储过程,Access还提供一种直接调用的方法,可以用Access 传递查询直接将命令发送到数据库服务器。
  建立Access 传递查询步骤如下:
  (1) 在数据库窗口中单击“查询”选项卡,然后单击“新建”按钮。
  (2) 在“新建查询”对话框中单击“设计视图”选项,然后单击“确定”按钮。
  (3) 在“显示表”对话框内单击“关闭”按钮。
  (4) 在“查询”菜单上,指到“SQL 语句条件”,然后单击“传递”命令。
  (5) 在工具栏上,请单击“属性”按钮 以显示查询属性表。
  (6) 在查询属性表中,请设置“ODBC 连接字符串”属性来指定要连接的数据库信息。可以输入连接信息: ”ODBC;DSN=ntserver0;UID=sa;PWD=;DATABASE=BMS”,或用“生成器”按钮生成。

阅读全文

ms sql删除重复的记录

: 我在ms sql中建了一个表,可由于种种原因有些记录重复了
: 记录完全的一模一样。
: 现在我想把重复的都删掉,只保留重复记录中的第一条。
: 我在database好象看到有介绍oracle的,
select distinct * into #table_name from table_name
delete from table_name
select * into table_name from #table_name
drop table #table_name
与此相关的是“select into”选项,可以在数据库属性
对话框中,勾起来此项,或者在Query Analyzer中执行
execute sp_dboption 'db_name','select into','true'
开启。默认值是关闭的。

阅读全文

MySQL中文模糊检索问题的解决方法

在 MySQL 下,在进行中文模糊检索时,经常会返回一些与之不相关的
记录,如查找 "%a%" 时,返回的可能有中文字符,却没有 a 字符存在。
本人以前也曾遇到过类似问题,经详细阅读 MySQL 的 Manual ,发现可以
有一种方法很方便的解决并得到满意的结果。
例子:
·希望通过“标题”对新闻库进行检索,关键字可能包含是中英文,如
下 SQL 语句:
select id,title,name from achech_com.news where title like '%a%'
返回的结果,某些 title 字段确定带了“a”关键字,而有些则只有中文,
但也随之返回在检索结果中。
解决方法,使用 BINARY 属性进行检索,如:
select id,title,name from achech_com.news where binary title like '%a%'
返回的结果较之前正确,但英文字母区分大小写,故有时在检索如“Achech”
及“achech”的结果是不一样的。
知道了使用 BINARY 属性可以解决前面这个问题,再看看 MySQL 支持的
UCASE 及 CONCAT 函数,其中 UCASE 是将英文全部转成大写,而 CONCAT 函
数的作用是对字符进行连接,以下是我们完全解决后的 SQL 语句:
select id,title,name from achech_com.news where binary ucase(title) like concat('%',ucase('a'),'%')
检索的步骤是先将属性指定为 BINARY ,以精确检索结果,而被 like 的 title
内容存在大小写字母的可能,故先使用 ucase 函数将字段内容全部转换成大
写字母,然后再进行 like 操作,而 like 的操作使用模糊方法,使用 concat
的好处是传进来的可以是直接的关键字,不需要带“%”万用符,将“'a'”直接
换成你的变量,在任何语言下都万事无忧了。
当然你也可以这么写:
select id,title,name from achech_com.news where binary ucase(title) like ucase('%a%')
检索的结果还算满意吧,不过速度可能会因此而慢N毫秒喔。
作者:林兴陆·Linxinglu@ihw.com.cn
相关资料:
Relate:
20.16 Case Sensitivity in Searches
By default, MySQL searches are case-insensitive (although there are some character sets that are never case insensitive, such as czech). That means that if you search with col_name LIKE 'a%', you will get all column values that start with A or a. If you want to make this search case-sensitive, use something like INDEX(col_name, "A")=0 to check a prefix. Or use STRCMP(col_name, "A") = 0 if the column value must be exactly "A".

阅读全文

简化SQL语句一例

举个例子,设表名为bbs 回复数的字段为renum 变量名$renum 记录序号字段为id 变量名$id
当我们在论坛回贴时会要改写主贴的回复数,传统的方法要用到到两句SQL语句:
//取出原值
$query1="select renum bbs where id = '$id'";
……
$renum  ;
//写回数据库

阅读全文

ACCESS数据库向MySQL快速迁移小程序

近日,本人为了将为公司开发的一个信息管理系统从以前试运行的开发机器上(Windows NT   IIS4.0   Access)迁移至一台真正的Linux服务器上(Apache1.3.12   PHP 4.03   MySQL 3.23.26),其中数据库中的几十个表的内容迁移,开始让我小费了一些周折,从网上也下载了一些MySqL的客户软件或是数据库管理软件,写得较好的软件均有数据迁移功能,但其迁移方式不外乎两种,一种是采用文件引入方式,此种方式在处理数据库中有和分隔符相同的字符时,会产生错误,尤其是在处理ACCESS中的Memo字段,很容易出错,最后导致导出后的数据不是多了就是少了。而另一种支持ODBC直接导入的功能较强,基本可无错误地导入各个表的内容,但很遗憾,这必须是建立在ACCESS中表格的字段是英文是才可以,如在ACCESS中字段是中文名,一般也出错,不能成功导入。

阅读全文

如何随机选取n条记录或者对记录作随机排序?

Q. 如何得到随机排序结果?
A. 要得到随机排序的列,或者返回x条随机选择的列,你可以使用随机数。但是RAND函数在一个查询中只能返回一个结果。你可以在NOWID函数返回的列上做ORDER BY。请看示例:
SELECT *
FROM Northwind..Orders
ORDER BY NEWID()
SELECT TOP 10 *
FROM Northwind..Orders
ORDER BY NEWID()
这段话翻译得真是费劲,干脆不管原文,直接意译了。
不过提醒大家注意,这种方法是要对整个表扫描,然后产生一个计算列再排序的,最好不要对大的表作这样的操作,否则会很慢的。
Q. How can I randomly sort query results?
A. To randomly order rows, or to return x number of randomly chosen rows, you can use the RAND function inside the SELECT statement. But the RAND function is resolved only once for the entire query, so every row will get same value. You can use an ORDER BY clause to sort the rows by the result from the NEWID function, as the following code shows:
SELECT *
FROM Northwind..Orders
ORDER BY NEWID()
SELECT TOP 10 *
FROM Northwind..Orders
ORDER BY NEWID()
—SQL Server MVPs

阅读全文