﻿<?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-&#xE; oDiBo  “开封菜”WWW.KFC.IM-随笔分类-数据库</title><link>http://www.blogjava.net/chenjiajin/category/40283.html</link><description>KFC.im记录学习、工作、生活中的点点滴滴…</description><language>zh-cn</language><lastBuildDate>Fri, 24 Jul 2009 09:49:38 GMT</lastBuildDate><pubDate>Fri, 24 Jul 2009 09:49:38 GMT</pubDate><ttl>60</ttl><item><title>SQL Server数据库开发的二十一条军规</title><link>http://www.blogjava.net/chenjiajin/archive/2009/07/22/287872.html</link><dc:creator>London2012</dc:creator><author>London2012</author><pubDate>Wed, 22 Jul 2009 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/chenjiajin/archive/2009/07/22/287872.html</guid><wfw:comment>http://www.blogjava.net/chenjiajin/comments/287872.html</wfw:comment><comments>http://www.blogjava.net/chenjiajin/archive/2009/07/22/287872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenjiajin/comments/commentRss/287872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenjiajin/services/trackbacks/287872.html</trackback:ping><description><![CDATA[如果你正在负责一个基于SQL Server的项目，或者你刚刚接触SQL Server，你都有可能要面临一些数据库性能的问题，这篇文章会为你提供一些有用的指导（其中大多数也可以用于其它的DBMS）。 <br />
在这里，我不打算介绍使用SQL Server的窍门，也不能提供一个包治百病的方案，我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我过去几年中经受的教训，一直来，我看到许多同样的设计错误被一次又一次的重复。 <br />
一、了解你用的工具 <br />
不要轻视这一点，这是我在这篇文章中讲述的最关键的一条。也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。 <br />
&#8220;什么？我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令？？？&#8221;，你也许会这样说。对的，你不需要这样做。但是你应该用一个周末浏览所有的T-SQL命令。在这里，你的任务是了解，将来，当你设计一个查询时，你会记起来：&#8220;对了，这里有一个命令可以完全实现我需要的功能&#8221;，于是，到MSDN查看这个命令的确切语法。 <br />
二、不要使用游标 <br />
让我再重复一遍：不要使用游标。如果你想破坏整个系统的性能的话，它们倒是你最有效的首选办法。大多数的初学者都使用游标，而没有意识到它们对性能造成的影响。它们占用内存，还用它们那些不可思议的方式锁定表，另外，它们简直就像蜗牛。而最糟糕的是，它们可以使你的DBA所能做的一切性能优化等于没做。不知你是否知道每执行一次FETCH就等于执行一次SELECT命令？这意味着如果你的游标有10000条记录，它将执行10000次SELECT！如果你使用一组SELECT、UPDATE或者DELETE来完成相应的工作，那将有效率的多。 <br />
初学者一般认为使用游标是一种比较熟悉和舒适的编程方式，可很不幸，这会导致糟糕的性能。显然，SQL的总体目的是你要实现什么，而不是怎样实现。 <br />
我曾经用T-SQL重写了一个基于游标的存储过程，那个表只有100,000条记录，原来的存储过程用了40分钟才执行完毕，而新的存储过程只用了10秒钟。在这里，我想你应该可以看到一个不称职的程序员究竟在干了什么！！！ <br />
我们可以写一个小程序来取得和处理数据并且更新数据库，这样做有时会更有效。记住：对于循环，T-SQL无能为力。 <br />
我再重新提醒一下：使用游标没有好处。除了DBA的工作外，我从来没有看到过使用游标可以有效的完成任何工作。 <br />
三、规范化你的数据表 <br />
为什么不规范化数据库？大概有两个借口：出于性能的考虑和纯粹因为懒惰。至于第二点，你迟早得为此付出代价。而关于性能的问题，你不需要优化根本就不慢的东西。我经常看到一些程序员&#8220;反规范化&#8221;数据库，他们的理由是&#8220;原来的设计太慢了&#8221;，可结果却常常是他们让系统更慢了。DBMS被设计用来处理规范数据库的，因此，记住：按照规范化的要求设计数据库。 <br />
四、不要使用SELECT * <br />
这点不太容易做到，我太了解了，因为我自己就经常这样干。可是，如果在SELECT中指定你所需要的列，那将会带来以下的好处： <br />
1 减少内存耗费和网络的带宽 <br />
2 你可以得到更安全的设计 <br />
3 给查询优化器机会从索引读取所有需要的列 <br />
五、了解你将要对数据进行的操作 <br />
为你的数据库创建一个健壮的索引，那可是功德一件。可要做到这一点简直就是一门艺术。每当你为一个表添加一个索引，SELECT会更快了，可INSERT和DELETE却大大的变慢了，因为创建了维护索引需要许多额外的工作。显然，这里问题的关键是：你要对这张表进行什么样的操作。这个问题不太好把握，特别是涉及DELETE和UPDATE时，因为这些语句经常在WHERE部分包含SELECT命令。 <br />
六、不要给&#8220;性别&#8221;列创建索引 <br />
首先，我们必须了解索引是如何加速对表的访问的。你可以将索引理解为基于一定的标准上对表进行划分的一种方式。如果你给类似于&#8220;性别&#8221;这样的列创建了一个索引，你仅仅是将表划分为两部分：男和女。你在处理一个有1,000,000条记录的表，这样的划分有什么意义？记住：维护索引是比较费时的。当你设计索引时，请遵循这样的规则：根据列可能包含不同内容的数目从多到少排列，比如：姓名+省份+性别。 <br />
七、使用事务 <br />
请使用事务，特别是当查询比较耗时。如果系统出现问题，这样做会救你一命的。一般有些经验的程序员都有体会-----你经常会碰到一些不可预料的情况会导致存储过程崩溃。 <br />
八、小心死锁 <br />
按照一定的次序来访问你的表。如果你先锁住表A，再锁住表B，那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你（不经意的）某个存储过程中先锁定表B，再锁定表A，这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好，死锁是不太容易被发现的。 <br />
九、不要打开大的数据集 <br />
一个经常被提出的问题是：我怎样才能迅速的将100000条记录添加到ComboBox中？这是不对的，你不能也不需要这样做。很简单，你的用户要浏览100000条记录才能找到需要的记录，他一定会诅咒你的。在这里，你需要的是一个更好的UI，你需要为你的用户显示不超过100或200条记录。 <br />
十、不要使用服务器端游标 <br />
与服务器端游标比起来，客户端游标可以减少服务器和网络的系统开销，并且还减少锁定时间。 <br />
十一、使用参数查询 <br />
有时，我在CSDN技术论坛看到类似这样的问题：&#8220;SELECT * FROM a WHERE a.id='A'B，因为单引号查询发生异常，我该怎么办？&#8221;，而普遍的回答是：用两个单引号代替单引号。这是错误的。这样治标不治本，因为你还会在其他一些字符上遇到这样的问题，更何况这样会导致严重的bug，除此以外，这样做还会使SQL Server的缓冲系统无法发挥应有的作用。使用参数查询， 釜底抽薪，这些问题统统不存在了。 <br />
十二、在程序编码时使用大数据量的数据库 <br />
程序员在开发中使用的测试数据库一般数据量都不大，可经常的是最终用户的数据量都很大。我们通常的做法是不对的，原因很简单：现在硬盘不是很贵，可为什么性能问题却要等到已经无可挽回的时候才被注意呢？ <br />
十三、不要使用INSERT导入大批的数据 <br />
请不要这样做，除非那是必须的。使用UTS或者BCP，这样你可以一举而兼得灵活性和速度。 <br />
十四、注意超时问题 <br />
查询数据库时，一般数据库的缺省都比较小，比如15秒或者30秒。而有些查询运行时间要比这长，特别是当数据库的数据量不断变大时。 <br />
十五、不要忽略同时修改同一记录的问题 <br />
有时候，两个用户会同时修改同一记录，这样，后一个修改者修改了前一个修改者的操作，某些更新就会丢失。处理这种情况不是很难：创建一个timestamp字段，在写入前检查它，如果允许，就合并修改，如果存在冲突，提示用户。 <br />
十六、在细节表中插入纪录时，不要在主表执行SELECT MAX(ID) <br />
这是一个普遍的错误，当两个用户在同一时间插入数据时，这会导致错误。你可以使用SCOPE_IDENTITY，IDENT_CURRENT和IDENTITY。如果可能，不要使用IDENTITY，因为在有触发器的情况下，它会引起一些问题（详见这里的讨论）。 <br />
十七、避免将列设为NULLable <br />
如果可能的话，你应该避免将列设为NULLable。系统会为NULLable列的每一行分配一个额外的字节，查询时会带来更多的系统开销。另外，将列设为NULLable使编码变得复杂，因为每一次访问这些列时都必须先进行检查。 <br />
我并不是说NULLS是麻烦的根源，尽管有些人这样认为。我认为如果你的业务规则中允许&#8220;空数据&#8221;，那么，将列设为NULLable有时会发挥很好的作用，但是，如果在类似下面的情况中使用NULLable，那简直就是自讨苦吃。 <br />
CustomerName1 <br />
CustomerAddress1 <br />
CustomerEmail1 <br />
CustomerName2 <br />
CustomerAddress2 <br />
CustomerEmail3 <br />
CustomerName1 <br />
CustomerAddress2 <br />
CustomerEmail3 <br />
如果出现这种情况，你需要规范化你的表了。 <br />
十八、尽量不要使用TEXT数据类型 <br />
除非你使用TEXT处理一个很大的数据，否则不要使用它。因为它不易于查询，速度慢，用的不好还会浪费大量的空间。一般的，VARCHAR可以更好的处理你的数据。 <br />
十九、尽量不要使用临时表 <br />
尽量不要使用临时表，除非你必须这样做。一般使用子查询可以代替临时表。使用临时表会带来系统开销，如果你是用COM+进行编程，它还会给你带来很大的麻烦，因为COM+使用数据库连接池而临时表却自始至终都存在。SQL Server提供了一些替代方案，比如Table数据类型。 <br />
二十、学会分析查询 <br />
SQL Server查询分析器是你的好伙伴，通过它你可以了解查询和索引是如何影响性能的。 <br />
二十一、使用参照完整性 <br />
定义主健、唯一性约束和外键，这样做可以节约大量的时间。 <br />
<img src ="http://www.blogjava.net/chenjiajin/aggbug/287872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenjiajin/" target="_blank">London2012</a> 2009-07-22 16:40 <a href="http://www.blogjava.net/chenjiajin/archive/2009/07/22/287872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句收集</title><link>http://www.blogjava.net/chenjiajin/archive/2009/06/15/282472.html</link><dc:creator>London2012</dc:creator><author>London2012</author><pubDate>Mon, 15 Jun 2009 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/chenjiajin/archive/2009/06/15/282472.html</guid><wfw:comment>http://www.blogjava.net/chenjiajin/comments/282472.html</wfw:comment><comments>http://www.blogjava.net/chenjiajin/archive/2009/06/15/282472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenjiajin/comments/commentRss/282472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenjiajin/services/trackbacks/282472.html</trackback:ping><description><![CDATA[<p>SQL语句先前写的时候，很容易把一些特殊的用法忘记，我特此整理了一下SQL语句操作。<br />
一、基础<br />
1、说明：创建数据库<br />
CREATE DATABASE database-name <br />
2、说明：删除数据库<br />
drop database dbname<br />
3、说明：备份sql server<br />
--- 创建 备份数据的 device<br />
USE master<br />
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'<br />
--- 开始 备份<br />
BACKUP DATABASE pubs TO testBack <br />
4、说明：创建新表<br />
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)<br />
根据已有的表创建新表： <br />
A：create table tab_new like tab_old (使用旧表创建新表)<br />
B：create table tab_new as select col1,col2... from tab_old definition only<br />
5、说明：删除新表<br />
drop table tabname <br />
6、说明：增加一个列<br />
Alter table tabname add column col type<br />
注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。<br />
7、说明：添加主键： Alter table tabname add primary key(col) <br />
说明：删除主键： Alter table tabname drop primary key(col) <br />
8、说明：创建索引：create [unique] index idxname on tabname(col....) <br />
删除索引：drop index idxname<br />
注：索引是不可更改的，想更改必须删除重新建。<br />
9、说明：创建视图：create view viewname as select statement <br />
删除视图：drop view viewname<br />
10、说明：几个简单的基本的sql语句<br />
选择：select * from table1 where 范围<br />
插入：insert into table1(field1,field2) values(value1,value2)<br />
删除：delete from table1 where 范围<br />
更新：update table1 set field1=value1 where 范围<br />
查找：select * from table1 where field1 like '%value1%' ---like的语法很精妙，查资料!<br />
排序：select * from table1 order by field1,field2 [desc]<br />
总数：select count as totalcount from table1<br />
求和：select sum(field1) as sumvalue from table1<br />
平均：select avg(field1) as avgvalue from table1<br />
最大：select max(field1) as maxvalue from table1<br />
最小：select min(field1) as minvalue from table1<br />
11、说明：几个高级查询运算词<br />
A： UNION 运算符 <br />
UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 <br />
B： EXCEPT 运算符 <br />
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 <br />
C： INTERSECT 运算符<br />
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 <br />
注：使用运算词的几个查询结果行必须是一致的。 <br />
12、说明：使用外连接 <br />
A、left outer join： <br />
左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 <br />
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br />
B：right outer join: <br />
右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。 <br />
C：full outer join： <br />
全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。<br />
二、提升<br />
1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)<br />
法一：select * into b from a where 1&lt;&gt;1<br />
法二：select top 0 * into b from a<br />
2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b;<br />
3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件<br />
例子：..from b in '"&amp;Server.MapPath(".")&amp;"\data.mdb" &amp;"' where..<br />
4、说明：子查询(表名1：a 表名2：b)<br />
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)<br />
5、说明：显示文章、提交人和最后回复时间<br />
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b<br />
6、说明：外连接查询(表名1：a 表名2：b)<br />
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br />
7、说明：在线视图查询(表名1：a )<br />
select * from (SELECT a,b,c FROM a) T where t.a &gt; 1;<br />
8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括<br />
select * from table1 where time between time1 and time2<br />
select a,b,c, from table1 where a not between 数值1 and 数值2<br />
9、说明：in 的使用方法<br />
select * from table1 where a [not] in ('值1','值2','值4','值6')<br />
10、说明：两张关联表，删除主表中已经在副表中没有的信息 <br />
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )<br />
11、说明：四表联查问题：<br />
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....<br />
12、说明：日程安排提前五分钟提醒 <br />
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5<br />
13、说明：一条sql 语句搞定数据库分页<br />
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段<br />
14、说明：前10条记录<br />
select top 10 * form table1 where 范围<br />
15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)<br />
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)<br />
16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表<br />
(select a from tableA ) except (select a from tableB) except (select a from tableC)<br />
17、说明：随机取出10条数据<br />
select top 10 * from tablename order by newid()<br />
18、说明：随机选择记录<br />
select newid()<br />
19、说明：删除重复记录<br />
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)<br />
20、说明：列出数据库里所有的表名<br />
select name from sysobjects where type='U' <br />
21、说明：列出表里的所有的<br />
select name from syscolumns where id=object_id('TableName')<br />
22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。<br />
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type<br />
显示结果：<br />
type vender pcs<br />
电脑 A 1<br />
电脑 A 1<br />
光盘 B 2<br />
光盘 A 2<br />
手机 B 3<br />
手机 C 3<br />
23、说明：初始化表table1<br />
TRUNCATE TABLE table1<br />
24、说明：选择从10到15的记录<br />
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc<br />
三、技巧<br />
1、1=1，1=2的使用，在SQL语句组合时用的较多<br />
"where 1=1" 是表示选择全部&nbsp;&nbsp; "where 1=2"全部不选，<br />
如：<br />
if @strWhere !='' <br />
begin<br />
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere <br />
end<br />
else <br />
begin<br />
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' <br />
end <br />
我们可以直接写成<br />
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere <br />
2、收缩数据库<br />
--重建索引<br />
DBCC REINDEX<br />
DBCC INDEXDEFRAG<br />
--收缩数据和日志<br />
DBCC SHRINKDB<br />
DBCC SHRINKFILE<br />
3、压缩数据库<br />
dbcc shrinkdatabase(dbname)<br />
4、转移数据库给新用户以已存在用户权限<br />
exec sp_change_users_login 'update_one','newname','oldname'<br />
go<br />
5、检查备份集<br />
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'<br />
6、修复数据库<br />
ALTER DATABASE [dvbbs] SET SINGLE_USER<br />
GO<br />
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK<br />
GO<br />
ALTER DATABASE [dvbbs] SET MULTI_USER<br />
GO<br />
7、日志清除<br />
SET NOCOUNT ON<br />
DECLARE @LogicalFileName sysname,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @MaxMinutes INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @NewSize INT</p>
<p>USE&nbsp;&nbsp;&nbsp;&nbsp; tablename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 要操作的数据库名<br />
SELECT&nbsp; @LogicalFileName = 'tablename_log',&nbsp; -- 日志文件名<br />
@MaxMinutes = 10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Limit on time allowed to wrap log.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @NewSize = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 你想设定的日志文件的大小(M)<br />
-- Setup / initialize<br />
DECLARE @OriginalSize int<br />
SELECT @OriginalSize = size <br />
&nbsp; FROM sysfiles<br />
&nbsp; WHERE name = @LogicalFileName<br />
SELECT 'Original Size of ' + db_name() + ' LOG is ' + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'<br />
&nbsp; FROM sysfiles<br />
&nbsp; WHERE name = @LogicalFileName<br />
CREATE TABLE DummyTrans<br />
&nbsp; (DummyColumn char (8000) not null)</p>
<p>DECLARE @Counter&nbsp;&nbsp; INT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @StartTime DATETIME,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @TruncLog&nbsp; VARCHAR(255)<br />
SELECT&nbsp; @StartTime = GETDATE(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'<br />
DBCC SHRINKFILE (@LogicalFileName, @NewSize)<br />
EXEC (@TruncLog)<br />
-- Wrap the log if necessary.<br />
WHILE&nbsp;&nbsp;&nbsp;&nbsp; @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND (@OriginalSize * 8 /1024) &gt; @NewSize&nbsp; <br />
&nbsp; BEGIN -- Outer loop.<br />
&nbsp;&nbsp;&nbsp; SELECT @Counter = 0<br />
&nbsp;&nbsp;&nbsp; WHILE&nbsp; ((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN -- update<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT DummyTrans VALUES ('Fill Log')&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DELETE DummyTrans<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT @Counter = @Counter + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; EXEC (@TruncLog)&nbsp; <br />
&nbsp; END&nbsp;&nbsp; <br />
SELECT 'Final Size of ' + db_name() + ' LOG is ' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),size) + ' 8K pages or ' + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'<br />
&nbsp; FROM sysfiles <br />
&nbsp; WHERE name = @LogicalFileName<br />
DROP TABLE DummyTrans<br />
SET NOCOUNT OFF <br />
8、说明：更改某个表<br />
exec sp_changeobjectowner 'tablename','dbo'<br />
9、存储更改全部表<br />
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch<br />
&nbsp;@OldOwner as NVARCHAR(128),<br />
&nbsp;@NewOwner as NVARCHAR(128)<br />
AS<br />
DECLARE @Name&nbsp;&nbsp; as NVARCHAR(128)<br />
DECLARE @Owner&nbsp; as NVARCHAR(128)<br />
DECLARE @OwnerName&nbsp; as NVARCHAR(128)<br />
DECLARE curObject CURSOR FOR <br />
&nbsp;select 'Name'&nbsp;&nbsp; = name,<br />
&nbsp; 'Owner'&nbsp;&nbsp; = user_name(uid)<br />
&nbsp;from sysobjects<br />
&nbsp;where user_name(uid)=@OldOwner<br />
&nbsp;order by name<br />
OPEN&nbsp; curObject<br />
FETCH NEXT FROM curObject INTO @Name, @Owner<br />
WHILE(@@FETCH_STATUS=0)<br />
BEGIN&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;if @Owner=@OldOwner <br />
&nbsp;begin<br />
&nbsp; set @OwnerName = @OldOwner + '.' + rtrim(@Name)<br />
&nbsp; exec sp_changeobjectowner @OwnerName, @NewOwner<br />
&nbsp;end<br />
-- select @name,@NewOwner,@OldOwner<br />
&nbsp;FETCH NEXT FROM curObject INTO @Name, @Owner<br />
END<br />
close curObject<br />
deallocate curObject<br />
GO</p>
<p>10、SQL SERVER中直接循环写入数据<br />
declare @i int<br />
set @i=1<br />
while @i&lt;30<br />
begin<br />
&nbsp;&nbsp; insert into test (userid) values(@i)<br />
&nbsp;&nbsp; set @i=@i+1<br />
end<br />
小记存储过程中经常用到的本周，本月，本年函数 <br />
Dateadd(wk,datediff(wk,0,getdate()),-1) <br />
Dateadd(wk,datediff(wk,0,getdate()),6) <br />
Dateadd(mm,datediff(mm,0,getdate()),0) <br />
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) <br />
Dateadd(yy,datediff(yy,0,getdate()),0) <br />
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) <br />
上面的SQL代码只是一个时间段 <br />
Dateadd(wk,datediff(wk,0,getdate()),-1) <br />
Dateadd(wk,datediff(wk,0,getdate()),6) <br />
就是表示本周时间段. <br />
下面的SQL的条件部分,就是查询时间段在本周范围内的: <br />
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) <br />
而在存储过程中 <br />
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) <br />
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/chenjiajin/aggbug/282472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenjiajin/" target="_blank">London2012</a> 2009-06-15 23:08 <a href="http://www.blogjava.net/chenjiajin/archive/2009/06/15/282472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>