﻿<?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-semovy-文章分类-MS SQLServer方面</title><link>http://www.blogjava.net/WshmAndLily/category/24627.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 24 Feb 2008 10:09:16 GMT</lastBuildDate><pubDate>Sun, 24 Feb 2008 10:09:16 GMT</pubDate><ttl>60</ttl><item><title>sqlserver2005内部函数，存储过程，以及数据库角色</title><link>http://www.blogjava.net/WshmAndLily/articles/181784.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 24 Feb 2008 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/181784.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/181784.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/181784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/181784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/181784.html</trackback:ping><description><![CDATA[/*日期函数*/<br />
DATEADD ( datepart , number, date ) <br />
--在向指定日期加上一段时间的基础上，返回新的 datetime 值。<br />
DATEDIFF ( datepart , startdate , enddate ) <br />
--返回跨两个指定日期的日期和时间边界数。<br />
DATENAME ( datepart , date )<br />
--返回代表指定日期的指定日期部分的字符串。<br />
DATEPART ( datepart , date ) <br />
--返回代表指定日期的指定日期部分的整数。<br />
DAY ( date ) <br />
--返回代表指定日期的天的日期部分的整数。<br />
GETDATE ( )<br />
--按 datetime 值的 Microsoft? SQL Server? 标准内部格式返回当前系统日期和时间。<br />
GETUTCDATE()<br />
--返回表示当前 UTC 时间（世界时间坐标或格林尼治标准时间）的 datetime 值。<br />
--当前的 UTC 时间得自当前的本地时间和运行 SQL Server 的计算机操作系统中的时区设置。<br />
MONTH ( date )<br />
--返回代表指定日期月份的整数。<br />
YEAR ( date )<br />
--返回表示指定日期中的年份的整数。<br />
--------------------------------------------------------------------------<br />
/*字符串处理函数*/<br />
LCASE( )<br />
LOWER( ) <br />
--将字符串转换为小写字母 <br />
LTRIM( ) <br />
--删除字符串前面的空格 <br />
SUBSTRING( ) <br />
--从字符串中提取一个或多个字符 <br />
UCASE( )<br />
UPPER( ) <br />
--将字符串转换为大写字母 <br />
ROUND( ) <br />
--将数字按指定的小数位数四舍五入 <br />
FLOOR( ) <br />
--将数字向下四舍五入为最接近（最小）的整数 <br />
CEILING( ) <br />
--将数字向上四舍五入为最接近的整数 <br />
DATALENGTH( ) <br />
--返回指定的表达式所用的字节数 <br />
--------------------------------------------------------------------------<br />
USER( )<br />
USER_NAME( ) <br />
--返回当前用户名 <br />
CONVERT( ) <br />
--将数据从一种类型转换为另一种类型。<br />
SOUNDEX( ) <br />
--为可创建"近似"搜索的指定表达式返回 Soundex 代码。<br />
STR( ) <br />
--将数字数据转换为字符串，以便可以用文本运算符对其进行处理。 <br />
/*全局变量*/<br />
@@CONNECTIONS<br />
--服务器上次启动以来创建的连接数<br />
@@CPU_BUSY&nbsp;&nbsp;<br />
--自 SQL Server 启动至今，系统持续运行的毫秒数。<br />
@@CURSOR_ROWS&nbsp;&nbsp;<br />
--最近打开的游标中的行数<br />
@@DATEFIRST&nbsp;&nbsp;&nbsp;<br />
--SET DATEFIRST 参数的当前值，该参数用于设置一个星期的第一天为哪一天。<br />
@@ERROR&nbsp;&nbsp;<br />
--最后一个 T-SQL 错误的错误号<br />
@@FETCH_STATUS <br />
--如果最后一次提取的状态为成功状态，则为 0。如果出错，则为 -1<br />
@@IDENTITY&nbsp;&nbsp;&nbsp;<br />
--最后一次插入的标识值<br />
@@LANGUAGE&nbsp;&nbsp;&nbsp;<br />
--当前使用的语言的名称<br />
@@MAX_CONNECTIONS <br />
--可以创建的同时连接的最大数<br />
@@ROWCOUNT&nbsp;&nbsp;&nbsp;<br />
--受上一个 SQL 语句影响的行数<br />
@@SERVERNAME&nbsp;&nbsp;<br />
--本地服务器的名称<br />
@@SERVICENAME&nbsp;&nbsp;<br />
--该计算机上的 SQL 服务的名称<br />
@@TIMETICKS&nbsp;&nbsp;<br />
--当前计算机上每指令周期的微秒数<br />
@@TRANSCOUNT&nbsp;&nbsp;<br />
--当前连接打开的事务数<br />
@@VERSION&nbsp;&nbsp;&nbsp;<br />
--SQL Server 的版本信息<br />
-----------------------------------------------------------------------<br />
/*存储过程*/<br />
sp_databases --列出服务器上的所有数据库<br />
sp_server_info --列出服务器信息，如字符集，版本和排列顺序<br />
sp_stored_procedures--列出当前环境中的所有存储过程<br />
sp_tables --列出当前环境中所有可以查询的对象<br />
sp_start_job --立即启动自动化任务<br />
sp_stop_job --停止正在执行的自动化任务<br />
sp_password --添加或修改登录帐户的密码<br />
sp_configure --显示(不带选项)或更改(带选项)当前服务器的全局配置设置<br />
sp_help --返回表的列名，数据类型，约束类型等<br />
sp_helptext --显示规则，默认值，未加密的存储过程，用户定义的函数，<br />
--触发器或视图的实际文本<br />
sp_helpfile --查看当前数据库信息<br />
sp_dboption --显示或更改数据库选项<br />
sp_detach_db --分离数据库<br />
sp_attach_db --附加数据库<br />
sp_addumpdevice --添加设备<br />
sp_dropdevice --删除设备<br />
sp_pkeys --查看主键<br />
sp_fkeys --查看外键<br />
sp_helpdb --查看指定数据库相关文件信息<br />
sp_addtype --自建数据类型<br />
sp_droptype --删除自建数据类型<br />
sp_rename --重新命名数据库<br />
sp_executesql --执行SQL语句<br />
sp_addlogin --添加登陆<br />
sp_droplogin --删除登录<br />
sp_grantdbaccess --把用户映射到登录，即添加一个数据库安全帐户并授予塔访问权限<br />
sp_revokedbaccess--撤销用户的数据访问权,即从数据库中删除一个安全帐户<br />
sp_addrole --添加角色<br />
sp_addrolemember --向角色中添加成员，使其成为数据库角色的成员<br />
sp_addsrvrolemember--修改登录使其成为固定服务器角色的成员<br />
sp_grantlogin --允许使用组帐户或系统用户使用Windows身份验证连接到SQL<br />
sp_defaultdb --修改一个登录的默认数据库<br />
sp_helpindex --用于查看表的索引<br />
sp_cursoropen --定义与游标和游标选项相关的SQL语句，然后生成游标<br />
sp_cursorfetch --从游标中提取一行或多行<br />
sp_cursorclose --关闭并释放游标<br />
sp_cursoroption --设置各种游标选项<br />
sp_cursor --用于请求定位更新<br />
sp_cursorprepare --把与游标有关的T-SQL语句或批处理编译成执行计划，但并不创建游标<br />
sp_cursorexecute --从由sp_cursorprepare创建的执行计划中创建并填充游标<br />
sp_cursorunprepare --废弃由sp_cursorprepare生成的执行计划<br />
sp_settriggerorder --指定第一个或最后一个激发的、与表关联的 AFTER 触发器。在第一个<br />
--和最后一个触发器之间激发的 AFTER 触发器将按未定义的顺序执行<br />
--------------------------------------------------------------------------------<br />
/*服务器角色*/<br />
sysadmin<br />
--在 SQL Server 中进行任何活动。该角色的权限跨越所有其它固定服务器角色。 <br />
serveradmin <br />
--配置服务器范围的设置。 <br />
setupadmin <br />
--添加和删除链接服务器，并执行某些系统存储过程（如 sp_serveroption）。 <br />
securityadmin <br />
--管理服务器登录。 <br />
processadmin <br />
--管理在 SQL Server 实例中运行的进程。 <br />
dbcreator <br />
--创建和改变数据库。 <br />
diskadmin <br />
--管理磁盘文件。 <br />
bulkadmin <br />
--执行 BULK INSERT 语句。<br />
/*数据库角色*/<br />
public<br />
public 角色<br />
--public 角色是一个特殊的数据库角色，每个数据库用户都属于它。public 角色： <br />
--捕获数据库中用户的所有默认权限。<br />
--无法将用户、组或角色指派给它，因为默认情况下它们即属于该角色。<br />
--含在每个数据库中，包括 master、msdb、tempdb、model 和所有用户数据库。<br />
--无法除去。<br />
db_owner <br />
--进行所有数据库角色的活动，以及数据库中的其它维护和配置活动。<br />
--该角色的权限跨越所有其它固定数据库角色。<br />
db_accessadmin <br />
--在数据库中添加或删除 Windows NT 4.0 或 Windows 2000 组和用户以及 SQL Server 用户。 <br />
db_datareader <br />
--查看来自数据库中所有用户表的全部数据。<br />
db_datawriter <br />
--添加、更改或删除来自数据库中所有用户表的数据<br />
db_ddladmin <br />
--添加、修改或除去数据库中的对象(运行所有 DDL)<br />
db_securityadmin <br />
--管理 SQL Server 2000 数据库角色的角色和成员，并管理数据库中的语句和对象权限<br />
db_backupoperator <br />
--有备份数据库的权限<br />
db_denydatareader <br />
--拒绝选择数据库数据的权限<br />
db_denydatawriter<br />
--拒绝更改数据库数据的权限
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/181784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-02-24 16:50 <a href="http://www.blogjava.net/WshmAndLily/articles/181784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver2005基本操作</title><link>http://www.blogjava.net/WshmAndLily/articles/181782.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 24 Feb 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/181782.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/181782.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/181782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/181782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/181782.html</trackback:ping><description><![CDATA[<p>exec sp_renamedb 'Mytest','Mytest'--对数据库重命名<br />
go<br />
--修改数据库属性，设置为只读<br />
exec sp_dboption 'Mytest','read only',false--true<br />
go<br />
--设置数据库为自动压缩<br />
exec sp_dboption 'Mytest',autoshrink ,true--false<br />
--收缩数据库的大小<br />
DBCC shrinkdatabase ('Mytest',10)--将压缩数据库Mytest的大小，以使userdb中文件有10MB的可用空间<br />
go<br />
--分离数据库<br />
exec sp_detach_db 'Mytest'<br />
--附加数据库<br />
exec sp_attach_db @dbname='Mytest',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @filename1='D:\Mytest\DB_data.mdf',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @filename2='D:\Mytest\DB_data.ldf';<br />
--数据库的备份<br />
go<br />
exec sp_addumpdevice 'disk','mydiskdump','d:\Mytest\Mytest.dat'--创建磁盘设备逻辑名<br />
backup database Mytest to mydiskdump<br />
go<br />
--数据库的恢复<br />
restore database 'Mytest'from mydiskdump<br />
go<br />
exec sp_dropdevice 'mydiskdump'<br />
--查看数据库<br />
sp_helpdb，sp_helpfilegroup,sp_database;<br />
use Mytest<br />
go</p>
<p>if exists (select *from sysobjects where name='Student')<br />
--if object_id('Student','u')is not null) <br />
drop table Student<br />
create table Student<br />
(<br />
&nbsp;&nbsp; Student_no&nbsp;&nbsp; int&nbsp;&nbsp; identity(1000,1),--自动增长 indentity（seed，increment） seed是基数据，increment是增长的速率，系统自动为该列添加数据<br />
&nbsp;&nbsp; Student_name varchar(20)<br />
)<br />
--两种插入数据的方法<br />
insert into Student values('wubo')<br />
insert into Student select 'zhang' union select 'lin' <br />
--添加主键约束<br />
alter table Student add constraint s_pk primary key (Student_no)<br />
--察看数据库mytest的信息<br />
sp_helpdb mytest--或者sp_databases Mytest<br />
select *from Student<br />
--------------------------------------------------------------------<br />
if exists (select *from sysobjects where name='Course')<br />
drop table Course<br />
create table Course<br />
(<br />
Course_no&nbsp;&nbsp; int identity(1000,1),<br />
Course_name varchar(20),<br />
<br />
)<br />
--设置服务器的identity关键字可以插入数据<br />
set identity_insert course on<br />
set identity_insert course off<br />
insert into Course values( 'c','zhang')<br />
insert into Course select 'java' union select 'c++'<br />
select *From Course<br />
--添加约束公式<br />
alter table table_name add constraint constraint_name constraint_type(column_name)<br />
**********<br />
alter table Course add constraint C_pk primary key (Course_no)<br />
--察看约束公式<br />
exec sp_helpconstraint table_name<br />
**********<br />
exec sp_helpconstraint Course<br />
--删除主键约束<br />
alter table Course drop C_pk<br />
--添加外键约束<br />
alter table table_name add constraint constraint_name foreign key (column_name) references referenced_table(referenced_table's column_name)<br />
--添加列并指定默认值为NULL，以前没有该列的数据都设置为NULL<br />
alter table Course add Course_teacher varchar(20) default null<br />
--删除列<br />
alter table Course drop column Course_teacher<br />
--重命名列<br />
exec sp_rename 'Course.Course_teacher','Course_teacher', 'column'<br />
--重命名表<br />
exec sp_rename 'Course','NewCourse'<br />
--复制表又复制数据,先创建表然后再复制数据,自增和NOT NULL可以复制，别的约束不能复制<br />
select * into temp1 from Course<br />
--只复制表结构<br />
select *into temp from Course where 1&gt;2<br />
--删除表中元素,不能删除被引用的数据，用以确保引用完整性<br />
delete from Course where Course_name='c++'<br />
/****************************************************/<br />
--这两种方法不能被外键引用，不可带条件删除<br />
--删除表中所有元素,写日志<br />
delete table Course<br />
--删除表中所有数据，不写日志，不安全<br />
truncate table Course<br />
/***************************************************/<br />
--模式匹配，%匹配任何字符串，_匹配任何一个字符，模式是大小写敏感的<br />
select *from Course where Course_name like 'c%'--只要第一个为c的字母就可以匹配<br />
select *from Course where Course_name like 'c_+'--这个字符串有三个字符，第二个字符可以使任意的<br />
select *from Course where Course_no between 1000 and 1002<br />
/***************************************************/<br />
--外键操作<br />
create table dept<br />
(<br />
&nbsp;&nbsp; d_id int primary key,<br />
&nbsp;&nbsp; d_name varchar(20)<br />
)<br />
create table emp<br />
(<br />
&nbsp;&nbsp; e_id int primary key,<br />
&nbsp;&nbsp; e_name varchar(20),<br />
&nbsp;&nbsp; e_no int foreign key references dept(d_id) on update cascade on delete cascade<br />
)<br />
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]<br />
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]<br />
如果 timestamp 列是外键或被引用键的一部分，则不能指定 CASCADE。<br />
--外健的建立是在主表建立外健的列是唯一属性的情况下才能建立<br />
--on delete no action 无级连更新，删除时外键冲突报错并回滚delete<br />
--on update no action 无级连更新，更新时外键冲突报错并回滚update<br />
--on delete cascade 删除时可以级联删除<br />
--on update cascade 更新时可以级联更新<br />
--删除数据时，先删除主表的数据，然后删除从表的数据，主表是：被引用的表，从表是：引用的表<br />
--插入数据时，先插入被引用的表，然后插入引用的表、<br />
/***************************多表查询与聚合****************************/<br />
create table company<br />
(<br />
c_id int primary key,<br />
c_name varchar(20),<br />
c_tel varchar(20)<br />
)<br />
create table dept<br />
(<br />
d_id int primary key,<br />
d_name varchar(20),<br />
d_tel varchar(20),<br />
d_no int foreign key references company(c_id)<br />
)<br />
create table emp<br />
(<br />
e_id int primary key,<br />
e_name varchar(20),<br />
e_tel varchar(20),<br />
e_no int foreign key references dept(d_id)<br />
)<br />
--插入数据<br />
insert into company select 1000,'sun','110' <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 1001,'ibm','120'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 1002,'mir','130'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 1003,'top','140'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 1004,'mos','150'<br />
insert into dept select 1,'hr','1100',1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 2,'money','1200',1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 3,'kaifa','1300',1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 4,'zuzhi','1400',1000<br />
insert into emp select 100,'wubo','1',1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 101,'zhang','2',2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 102,'lin','3',3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 103,'linbo','4',4<br />
select *from company<br />
select *from dept<br />
select *from emp<br />
select * from emp left outer join dept on emp.e_no=dept.d_id left outer join company on dept.d_no=company.c_id<br />
--左连接运算时，左边的在运算后全部存在，右边的不匹配的用NULL表示<br />
select emp.e_id,emp.e_name from emp left outer join dept on emp.e_no=dept.d_id<br />
--右连接运算时，右表的在运算后全部存在，左边的不匹配的用NULL表示<br />
select * from dept right outer join emp on emp.e_no=dept.d_id<br />
--全连接<br />
select *from dept full join emp on emp.e_no=dept.d_id<br />
--交叉连接（笛卡尔积）<br />
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小<br />
select e.employeeid, d.name as department from humanresources.employee e cross joinh umanresources.department d order by e.employeeid, d.name <br />
--内连接：仅显示两的连接表中的匹配行的连接<br />
select * from goods inner join provider on goods.provider_id=provider.provider_id<br />
--联合查询：<br />
联合查询 union all关键字. <br />
(1)将两个或更多查询的结果合并为单个结果集，该结果集包含联合查询中的所有查询的全部行。UNION 运算不同于使用联接合并两个表中的列的运算。<br />
(2) 下面列出了使用 UNION 合并两个查询结果集的基本规则： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有查询中的列数和列的顺序必须相同。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据类型必须兼容。<br />
(3) all 参数:将全部行并入结果中。其中包括重复行。如果未指定该参数，则删除重复行<br />
------------------------------------------------------------------<br />
--自引用问题<br />
create table employ<br />
(<br />
e_id int primary key,<br />
e_name varchar(23),<br />
e_tel varchar(23),<br />
e_high int foreign key references employ(e_id)<br />
)<br />
insert into employ select 1,'wubo','13484623684',null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 2,'zhang','13772436004',1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 3,'lin','12345678945',1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union select 4,'bolin','231456789',2<br />
select *From employ<br />
select *from employ e inner join employ m on e.e_id=m.e_high<br />
<br />
<br />
<br />
<br />
<br />
</p>
<div class="tit">sqlserver2005基础知识</div>
<div class="date">2007-05-29 15:55</div>
<p>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>--创建数据库：<br />
            use master<br />
            --两种判断数据库是否存在的方法<br />
            if db_id('Mytest')is not null******(if exists(select *from sysdatabases where name='Mytest'))<br />
            drop database Mytest<br />
            go<br />
            --exec xp_cmdshell 'mkdir D:\Mytest'--调用DOS命令创建文件夹<br />
            --sql server2005种有三种类型文件<br />
            主数据文件.mdf，次要数据文件.ndf，日志文件.ldf<br />
            create database Mytest<br />
            on <br />
            (name=Mytest_dat,<br />
            filename='D:\Mytest\DB_data.mdf',<br />
            --CREATE DATABASE 失败。<br />
            --主文件必须至少是 3 MB 才能容纳模型数据库的副本，创建主数据文件<br />
            size=3mb,<br />
            --maxsize=??可以规定最大值当没有设置此项的时候，说明数据库是无限增长的<br />
            filegrowth=1mb 当文件大于设置的size时，文件增长的大小为1Mb<br />
            )<br />
            log on--创建日志文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Log文件的设置项和主文件的设置项一样的<br />
            (<br />
            name=Mytest_log,<br />
            filename='D:\Mytest\DB_data.ldf',<br />
            size=1mb,<br />
            --maxsize=??可以规定最大值<br />
            filegrowth=1mb<br />
            </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/181782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-02-24 16:38 <a href="http://www.blogjava.net/WshmAndLily/articles/181782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态创建表</title><link>http://www.blogjava.net/WshmAndLily/articles/179974.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 14 Feb 2008 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/179974.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/179974.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/179974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/179974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/179974.html</trackback:ping><description><![CDATA[if exists(select * from sysobjects where id=object_id(N'item') and objectproperty(id,N'isUserTable')=1)<br />
drop table item;<br />
create table item(id int not null identity(1,1) primary key,categoryId int not null foreign key references category(类别ID),itemName varchar(255) default '')<br />
insert into item(categoryId,itemName) values(2,'杂志社');<br />
insert into item(categoryId,itemName) values(2,'dfsdf');<br />
select * from item;<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/179974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-02-14 21:30 <a href="http://www.blogjava.net/WshmAndLily/articles/179974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ms SqlServer日期格式化大全</title><link>http://www.blogjava.net/WshmAndLily/articles/169557.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 22 Dec 2007 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/169557.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/169557.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/169557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/169557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/169557.html</trackback:ping><description><![CDATA[<div style="font-size: 12px">
<div style="text-align: center"></div>
CONVERT<br />
将某种数据类型的表达式显式转换为另一种数据类型。由于某些需求经常用到取日期格式的不同.现以下可在<br />
SQL Server中　将日期格式化.<br />
<br />
使用 CONVERT：<br />
<br />
CONVERT (data_type[(length)], expression [, style])<br />
<br />
<br />
select CONVERT(varchar, getdate(), 120 )<br />
2004-09-12 11:06:08<br />
<br />
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),\'-\',\'\'),\' \',\'\'),\':\',\'\')<br />
20040912110608<br />
<br />
select CONVERT(varchar(12) , getdate(), 111 )<br />
2004/09/12<br />
<br />
select CONVERT(varchar(12) , getdate(), 112 )<br />
20040912<br />
<br />
select CONVERT(varchar(12) , getdate(), 102 )<br />
2004.09.12<br />
<br />
select CONVERT(varchar(12) , getdate(), 101 )<br />
09/12/2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 103 )<br />
12/09/2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 104 )<br />
12.09.2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 105 )<br />
12-09-2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 106 )<br />
12 09 2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 107 )<br />
09 12, 2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 108 )<br />
11:06:08<br />
<br />
select CONVERT(varchar(12) , getdate(), 109 )<br />
09 12 2004 1<br />
<br />
select CONVERT(varchar(12) , getdate(), 110 )<br />
09-12-2004<br />
<br />
select CONVERT(varchar(12) , getdate(), 113 )<br />
12 09 2004 1<br />
<br />
select CONVERT(varchar(12) , getdate(), 114 )<br />
11:06:08.177</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/169557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-12-22 14:06 <a href="http://www.blogjava.net/WshmAndLily/articles/169557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server SQL语句导入导出大全</title><link>http://www.blogjava.net/WshmAndLily/articles/152254.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152254.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152254.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152254.html</trackback:ping><description><![CDATA[简介：微软SQL Server数据库SQL语句导入导出大全，包括与其他数据库和文件的数据的导入导出。
<p>/*******&nbsp; 导出到<a title="Excel相关知识技巧" href="http://www.vipcn.com/InfoList/Catalog_53_1.html" target="_blank">Excel</a> <br />
EXEC master..<a title="XP技巧 XP秘笈" href="http://www.vipcn.com/InfoList/Catalog_26_1.html" target="_blank">XP</a>_cmdshell &#8217;bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""&#8217; </p>
<p>/***********&nbsp; 导入Excel <br />
SELECT * <br />
FROM OpenDataSource( &#8217;Microsoft.Jet.OLEDB.4.0&#8217;, <br />
&nbsp; &#8217;Data Source="c:\test.xls";User ID=Admin;Pass<a title="Word" href="http://www.vipcn.com/InfoList/Catalog_51_1.html" target="_blank">Word</a>=;Extended properties=Excel 5.0&#8217;)...xactions </p>
<p>SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+&#8217;　&#8217; 转换后的别名 <br />
FROM OpenDataSource( &#8217;Microsoft.Jet.OLEDB.4.0&#8217;, <br />
&nbsp; &#8217;Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0&#8217;)...xactions </p>
<p>/** 导入文本文件 <br />
EXEC master..xp_cmdshell &#8217;bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; </p>
<p>/** 导出文本文件 <br />
EXEC master..xp_cmdshell &#8217;bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; <br />
或 <br />
EXEC master..xp_cmdshell &#8217;bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; </p>
<p>导出到TXT文本，用逗号分开 <br />
exec master..xp_cmdshell &#8217;bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password&#8217; </p>
<p>BULK INSERT 库名..表名 <br />
FROM &#8217;c:\test.txt&#8217; <br />
WITH ( <br />
&nbsp;&nbsp;&nbsp; FIELDTERMINATOR = &#8217;;&#8217;, <br />
&nbsp;&nbsp;&nbsp; ROWTERMINATOR = &#8217;\n&#8217; <br />
) </p>
<p>--/* dBase IV文件 <br />
select * from <br />
OPENROWSET(&#8217;MICROSOFT.JET.OLEDB.4.0&#8217; <br />
,&#8217;dBase IV;HDR=NO;IMEX=2;DATABASE=C:\&#8217;,&#8217;select * from [客户资料4.dbf]&#8217;) <br />
--*/ </p>
<p>--/* dBase III文件 <br />
select * from <br />
OPENROWSET(&#8217;MICROSOFT.JET.OLEDB.4.0&#8217; <br />
,&#8217;dBase III;HDR=NO;IMEX=2;DATABASE=C:\&#8217;,&#8217;select * from [客户资料3.dbf]&#8217;) <br />
--*/ </p>
<p>--/* FoxPro 数据库 <br />
select * from openrowset(&#8217;MSDASQL&#8217;, <br />
&#8217;Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\&#8217;, <br />
&#8217;select * from [aa.DBF]&#8217;) <br />
--*/ </p>
<p>/**************导入DBF文件****************/ <br />
select * from openrowset(&#8217;MSDASQL&#8217;, <br />
&#8217;Driver=Microsoft Visual FoxPro Driver; <br />
SourceDB=e:\VFP98\data; <br />
SourceType=DBF&#8217;, <br />
&#8217;select * from customer where country != "USA" order by country&#8217;) <br />
go <br />
/***************** 导出到DBF ***************/ <br />
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句 </p>
<p>insert into openrowset(&#8217;MSDASQL&#8217;, <br />
&#8217;Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\&#8217;, <br />
&#8217;select * from [aa.DBF]&#8217;) <br />
select * from 表 </p>
<p>说明:</p>
<p>SourceDB=c:\&nbsp; 指定foxpro表所在的文件夹 <br />
aa.DBF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定foxpro表的文件名. </p>
<p>/*************导出到<a title="Access知识技巧" href="http://www.vipcn.com/InfoList/Catalog_52_1.html" target="_blank">Access</a>********************/ <br />
insert into openrowset(&#8217;Microsoft.Jet.OLEDB.4.0&#8217;, <br />
</p>
&nbsp;&#8217;x:\A.mdb&#8217;;&#8217;admin&#8217;;&#8217;&#8217;,A表) select * from 数据库名..B表
<p>&nbsp;</p>
<p>/*************导入Access********************/ <br />
insert into B表 selet * from openrowset(&#8217;Microsoft.Jet.OLEDB.4.0&#8217;, <br />
&nbsp;&nbsp; &#8217;x:\A.mdb&#8217;;&#8217;admin&#8217;;&#8217;&#8217;,A表) </p>
<p>&nbsp;</p>
<p>*********************&nbsp; 导入 <a title="XML学习教程" href="http://www.vipcn.com/InfoList/Catalog_83_1.html" target="_blank">XML</a>　文件 </p>
<p>DECLARE @idoc int <br />
DECLARE @doc varchar(1000) <br />
--sample XML document <br />
SET @doc =&#8217; <br />
&lt;root&gt; <br />
&nbsp; &lt;Customer cid= "C1" name="Janine" city="Issaquah"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Order oid="O1" date="1/20/1996" amount="3.5" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Order oid="O2" date="4/30/1997" amount="13.4"&gt;Customer was very satisfied <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Order&gt; <br />
&nbsp;&nbsp; &lt;/Customer&gt; <br />
&nbsp;&nbsp; &lt;Customer cid="C2" name="Ursula" city="Oelde" &gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; white red"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Urgency&gt;Important&lt;/Urgency&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Happy Customer. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Order&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Order oid="O4" date="1/20/1996" amount="10000"/&gt; <br />
&nbsp;&nbsp; &lt;/Customer&gt; <br />
&lt;/root&gt; <br />
&#8217; <br />
-- Create an internal representation of the XML document. <br />
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc </p>
<p>-- Execute a SELECT statement using OPENXML rowset provider. <br />
SELECT * <br />
FROM OPENXML (@idoc, &#8217;/root/Customer/Order&#8217;, 1) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WITH (oid&nbsp;&nbsp;&nbsp;&nbsp; char(5), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; amount&nbsp; float, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comment ntext &#8217;text()&#8217;) <br />
EXEC sp_xml_removedocument @idoc </p>
<p>/********************导整个数据库*********************************************/ </p>
<p>用bcp实现的<a title="存储相关资讯" href="http://www.vipcn.com/InfoList/Catalog_246_1.html" target="_blank">存储</a>过程 </p>
<p>/* <br />
&nbsp;实现数据导入/导出的存储过程 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据不同的参数,可以实现导入/导出整个数据库/单个表 <br />
&nbsp;调用示例: <br />
--导出调用示例 <br />
----导出单个表 <br />
exec file2table &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;xzkh_sa..地区资料&#8217;,&#8217;c:\zj.txt&#8217;,1 <br />
----导出整个数据库 <br />
exec file2table &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;xzkh_sa&#8217;,&#8217;C:\docman&#8217;,1 </p>
<p>--导入调用示例 <br />
----导入单个表 <br />
exec file2table &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;xzkh_sa..地区资料&#8217;,&#8217;c:\zj.txt&#8217;,0 <br />
----导入整个数据库 <br />
exec file2table &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;xzkh_sa&#8217;,&#8217;C:\docman&#8217;,0 </p>
<p>*/ <br />
if exists(select 1 from sysobjects where name=&#8217;File2Table&#8217; and objectproperty(id,&#8217;IsProcedure&#8217;)=1) <br />
&nbsp;drop procedure File2Table</p>
go <br />
create procedure File2Table <br />
@servername varchar(200)&nbsp; --<a title="服务器" href="http://www.vipcn.com/InfoList/Catalog_37_1.html" target="_blank">服务器</a>名 <br />
,@username varchar(200)&nbsp;&nbsp; --用户名,如果用NT验证方式,则为空&#8217;&#8217; <br />
,@password varchar(200)&nbsp;&nbsp; --密码 <br />
,@tbname varchar(500)&nbsp;&nbsp; --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表 <br />
,@filename varchar(1000)&nbsp; --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt <br />
,@isout bit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --1为导出,0为导入 <br />
as <br />
declare @sql varchar(8000)
<p>&nbsp;</p>
<p>if @tbname like &#8217;%.%.%&#8217; --如果指定了表名,则直接导出单个表 <br />
begin <br />
&nbsp;set @sql=&#8217;bcp &#8217;+@tbname <br />
&nbsp; +case when @isout=1 then &#8217; out &#8217; else &#8217; in &#8217; end <br />
&nbsp; +&#8217; "&#8217;+@filename+&#8217;" /w&#8217; <br />
&nbsp; +&#8217; /S &#8217;+@servername <br />
&nbsp; +case when isnull(@username,&#8217;&#8217;)=&#8217;&#8217; then &#8217;&#8217; else &#8217; /U &#8217;+@username end <br />
&nbsp; +&#8217; /P &#8217;+isnull(@password,&#8217;&#8217;) <br />
&nbsp;exec master..xp_cmdshell @sql <br />
end <br />
else <br />
begin --导出整个数据库,定义游标,取出所有的用户表 <br />
&nbsp;declare @m_tbname varchar(250) <br />
&nbsp;if right(@filename,1)&lt;&gt;&#8217;\&#8217; set @filename=@filename+&#8217;\&#8217; </p>
<p>&nbsp;set @m_tbname=&#8217;declare #tb cursor for select name from &#8217;+@tbname+&#8217;..sysobjects where xtype=&#8217;&#8217;U&#8217;&#8217;&#8217; <br />
&nbsp;exec(@m_tbname) <br />
&nbsp;open #tb <br />
&nbsp;fetch next from #tb into @m_tbname <br />
&nbsp;while @@fetch_status=0 <br />
&nbsp;begin <br />
&nbsp; set @sql=&#8217;bcp &#8217;+@tbname+&#8217;..&#8217;+@m_tbname <br />
&nbsp;&nbsp; +case when @isout=1 then &#8217; out &#8217; else &#8217; in &#8217; end <br />
&nbsp;&nbsp; +&#8217; "&#8217;+@filename+@m_tbname+&#8217;.txt " /w&#8217; <br />
&nbsp;&nbsp; +&#8217; /S &#8217;+@servername <br />
&nbsp;&nbsp; +case when isnull(@username,&#8217;&#8217;)=&#8217;&#8217; then &#8217;&#8217; else &#8217; /U &#8217;+@username end <br />
&nbsp;&nbsp; +&#8217; /P &#8217;+isnull(@password,&#8217;&#8217;) <br />
&nbsp; exec master..xp_cmdshell @sql <br />
&nbsp; fetch next from #tb into @m_tbname <br />
&nbsp;end <br />
&nbsp;close #tb <br />
&nbsp;deallocate #tb&nbsp; <br />
end <br />
go </p>
<p>&nbsp;</p>
<p>/**********************Excel导到Txt****************************************/ <br />
想用 <br />
select * into opendatasource(...) from opendatasource(...) <br />
实现将一个Excel文件内容导入到一个文本文件 </p>
<p>假设Excel中有两列，第一列为姓名，第二列为很行帐号(16位) <br />
且银行帐号导出到文本文件后分两部分，前8位和后8位分开。 </p>
<p>如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2 <br />
然后就可以用下面的语句进行插入 <br />
注意文件名和目录根据你的实际情况进行<a title="电脑硬件维修" href="http://www.vipcn.com/InfoList/Catalog_138_1.html" target="_blank">修</a>改. </p>
<p>insert into <br />
opendatasource(&#8217;MICROSOFT.JET.OLEDB.4.0&#8217; <br />
,&#8217;Text;HDR=Yes;DATABASE=C:\&#8217; <br />
)...[aa#txt] <br />
--,aa#txt) <br />
--*/ <br />
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />
from <br />
opendatasource(&#8217;MICROSOFT.JET.OLEDB.4.0&#8217; <br />
,&#8217;Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls&#8217; <br />
--,Sheet1$) <br />
)...[Sheet1$] </p>
<p>如果你想直接插入并生成文本文件,就要用bcp </p>
<p>declare @sql varchar(8000),@tbname varchar(50) </p>
<p>--首先将excel表内容导入到一个全局临时表 <br />
select @tbname=&#8217;[##temp&#8217;+cast(newid() as varchar(40))+&#8217;]&#8217; <br />
&nbsp;,@sql=&#8217;select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />
into &#8217;+@tbname+&#8217; from <br />
opendatasource(&#8217;&#8217;MICROSOFT.JET.OLEDB.4.0&#8217;&#8217; <br />
,&#8217;&#8217;Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls&#8217;&#8217; <br />
)...[Sheet1$]&#8217; <br />
exec(@sql) </p>
<p>&nbsp;</p>
<p>--然后用bcp从全局临时表导出到文本文件 <br />
set @sql=&#8217;bcp "&#8217;+@tbname+&#8217;" out "c:\aa.txt" /S"(local)" /P"" /c&#8217; <br />
exec master..xp_cmdshell @sql </p>
<p>--删除临时表 <br />
exec(&#8217;drop table &#8217;+@tbname) </p>
<p>用bcp将文件导入导出到数据库的存储过程: </p>
<p>/*--bcp-二进制文件的导入导出 </p>
<p>&nbsp;支持image,text,ntext字段的导入/导出 <br />
&nbsp;image适合于二进制文件;text,ntext适合于文本数据文件 </p>
<p>&nbsp;注意:导入时,将覆盖满足条件的所有行 <br />
&nbsp; 导出时,将把所有满足条件的行也出到指定文件中 </p>
<p>&nbsp;此存储过程仅用bcp实现 <br />
邹建 2003.08-----------------*/ </p>
<p>/*--调用示例 <br />
--数据导出 <br />
&nbsp;exec p_binaryIO &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;acc_演示数据..tb&#8217;,&#8217;img&#8217;,&#8217;c:\zj1.dat&#8217; </p>
<p>--数据导出 <br />
&nbsp;exec p_binaryIO &#8217;zj&#8217;,&#8217;&#8217;,&#8217;&#8217;,&#8217;acc_演示数据..tb&#8217;,&#8217;img&#8217;,&#8217;c:\zj1.dat&#8217;,&#8217;&#8217;,0 <br />
--*/ <br />
if exists (select * from dbo.sysobjects where id = object_id(N&#8217;[dbo].[p_binaryIO]&#8217;) and OBJECTPROPERTY(id, N&#8217;IsProcedure&#8217;) = 1) <br />
drop procedure [dbo].[p_binaryIO] <br />
GO </p>
<p>Create proc p_binaryIO <br />
@servename varchar (30),--服务器名称 <br />
@username varchar (30), --用户名 <br />
@password varchar (30), --密码 <br />
@tbname varchar (500),&nbsp; --数据库..表名 <br />
@fdname varchar (30),&nbsp; --字段名 <br />
@fname varchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+.bak <br />
@tj varchar (1000)=&#8217;&#8217;,&nbsp; --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀 <br />
@isout bit=1&nbsp;&nbsp; --1导出((默认),0导入 <br />
AS <br />
declare @fname_in varchar(1000) --bcp处理应答文件名 <br />
&nbsp;,@fsize varchar(20)&nbsp;&nbsp; --要处理的文件的大小 <br />
&nbsp;,@m_tbname varchar(50)&nbsp; --临时表名 <br />
&nbsp;,@sql varchar(8000) </p>
<p>--则取得导入文件的大小 <br />
if @isout=1 <br />
&nbsp;set @fsize=&#8217;0&#8217; <br />
else <br />
begin <br />
&nbsp;create table #tb(可选名 varchar(20),大小 int <br />
&nbsp; ,创建日期 varchar(10),创建时间 varchar(20) <br />
&nbsp; ,上次写操作日期 varchar(10),上次写操作时间 varchar(20) <br />
&nbsp; ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int) <br />
&nbsp;insert into #tb <br />
&nbsp;exec master..xp_getfiledetails @fname <br />
&nbsp;select @fsize=大小 from #tb <br />
&nbsp;drop table #tb <br />
&nbsp;if @fsize is null <br />
&nbsp;begin <br />
&nbsp; print &#8217;文件未找到&#8217; <br />
&nbsp; return <br />
&nbsp;end </p>
<p>end </p>
<p>&nbsp;</p>
<p>--生成数据处理应答文件 <br />
set @m_tbname=&#8217;[##temp&#8217;+cast(newid() as varchar(40))+&#8217;]&#8217; <br />
set @sql=&#8217;select * into &#8217;+@m_tbname+&#8217; from( <br />
&nbsp;select null as 类型 <br />
&nbsp;union all select 0 as 前缀 <br />
&nbsp;union all select &#8217;+@fsize+&#8217; as 长度 <br />
&nbsp;union all select null as 结束 <br />
&nbsp;union all select null as 格式 <br />
&nbsp;) a&#8217; <br />
exec(@sql) <br />
select @fname_in=@fname+&#8217;_temp&#8217; <br />
&nbsp;,@sql=&#8217;bcp "&#8217;+@m_tbname+&#8217;" out "&#8217;+@fname_in <br />
&nbsp;+&#8217;" /S"&#8217;+@servename <br />
&nbsp;+case when isnull(@username,&#8217;&#8217;)=&#8217;&#8217; then &#8217;&#8217; <br />
&nbsp; else &#8217;" /U"&#8217;+@username end <br />
&nbsp;+&#8217;" /P"&#8217;+isnull(@password,&#8217;&#8217;)+&#8217;" /c&#8217; <br />
exec master..xp_cmdshell @sql <br />
--删除临时表 <br />
set @sql=&#8217;drop table &#8217;+@m_tbname <br />
exec(@sql) </p>
<p>if @isout=1 <br />
begin <br />
&nbsp;set @sql=&#8217;bcp "select top 1 &#8217;+@fdname+&#8217; from &#8217;&nbsp;<br />
&nbsp;+@tbname+case isnull(@tj,&#8217;&#8217;) when &#8217;&#8217; then &#8217;&#8217; <br />
&nbsp;&nbsp; else &#8217; where &#8217;+@tj end <br />
&nbsp; +&#8217;" queryout "&#8217;+@fname <br />
&nbsp; +&#8217;" /S"&#8217;+@servename <br />
&nbsp; +case when isnull(@username,&#8217;&#8217;)=&#8217;&#8217; then &#8217;&#8217; <br />
&nbsp;&nbsp; else &#8217;" /U"&#8217;+@username end <br />
&nbsp; +&#8217;" /P"&#8217;+isnull(@password,&#8217;&#8217;) <br />
&nbsp; +&#8217;" /i"&#8217;+@fname_in+&#8217;"&#8217; <br />
&nbsp;exec master..xp_cmdshell @sql <br />
end <br />
else <br />
begin <br />
&nbsp;--为数据导入准备临时表 <br />
&nbsp;set @sql=&#8217;select top 0 &#8217;+@fdname+&#8217; into &#8217; <br />
&nbsp; +@m_tbname+&#8217; from &#8217; +@tbname <br />
&nbsp;exec(@sql) </p>
<p>&nbsp;</p>
<p>&nbsp;--将数据导入到临时表 <br />
&nbsp;set @sql=&#8217;bcp "&#8217;+@m_tbname+&#8217;" in "&#8217;+@fname <br />
&nbsp; +&#8217;" /S"&#8217;+@servename <br />
&nbsp; +case when isnull(@username,&#8217;&#8217;)=&#8217;&#8217; then &#8217;&#8217; <br />
&nbsp;&nbsp; else &#8217;" /U"&#8217;+@username end <br />
&nbsp; +&#8217;" /P"&#8217;+isnull(@password,&#8217;&#8217;) <br />
&nbsp; +&#8217;" /i"&#8217;+@fname_in+&#8217;"&#8217; <br />
&nbsp;exec master..xp_cmdshell @sql <br />
&nbsp; <br />
&nbsp;--将数据导入到正式表中 <br />
&nbsp;set @sql=&#8217;update &#8217;+@tbname <br />
&nbsp; +&#8217; set &#8217;+@fdname+&#8217;=b.&#8217;+@fdname <br />
&nbsp; +&#8217; from &#8217;+@tbname+&#8217; a,&#8217; <br />
&nbsp; +@m_tbname+&#8217; b&#8217; <br />
&nbsp; +case isnull(@tj,&#8217;&#8217;) when &#8217;&#8217; then &#8217;&#8217; <br />
&nbsp;&nbsp; else &#8217; where &#8217;+@tj end <br />
&nbsp;exec(@sql) </p>
<p>&nbsp;--删除数据处理临时表 <br />
&nbsp;set @sql=&#8217;drop table &#8217;+@m_tbname <br />
end </p>
<p>--删除数据处理应答文件 <br />
set @sql=&#8217;del &#8217;+@fname_in <br />
exec master..xp_cmdshell @sql </p>
<p>go </p>
<p><br />
/** 导入文本文件 <br />
EXEC master..xp_cmdshell &#8217;bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; </p>
<p>改为如下，不需引号 <br />
EXEC master..xp_cmdshell &#8217;bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; </p>
<p>/** 导出文本文件 <br />
EXEC master..xp_cmdshell &#8217;bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword&#8217; <br />
此句需加引号</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:33 <a href="http://www.blogjava.net/WshmAndLily/articles/152254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sql Server实用操作小技巧集合</title><link>http://www.blogjava.net/WshmAndLily/articles/152251.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152251.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152251.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152251.html</trackback:ping><description><![CDATA[包括安装时提示有挂起的操作、收缩数据库、<a title="压缩软件技巧" href="http://www.vipcn.com/InfoList/Catalog_43_1.html" target="_blank">压缩</a>数据库、转移数据库给新用户以已存在用户权限、检查备份集、<a title="电脑硬件维修" href="http://www.vipcn.com/InfoList/Catalog_138_1.html" target="_blank">修</a>复数据库等 <br />
（一）挂起操作 <br />
在安装Sql或sp<a title="升级补丁" href="http://www.vipcn.com/SoftList/Catalog_47_SoftTime_Desc_1.html" target="_blank">补丁</a>的时候系统提示之前有挂起的安装操作，要求重启，这里往往重启无用，解决办法： <br />
到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager <br />
删除PendingFileRenameOperations <br />
（二）收缩数据库 <br />
--重建索引 <br />
DBCC REINDEX <br />
DBCC INDEXDEFRAG <br />
--收缩数据和日志 <br />
DBCC SHRINKDB <br />
DBCC SHRINKFILE <br />
（三）压缩数据库 <br />
dbcc shrinkdatabase(dbname) <br />
（四）转移数据库给新用户以已存在用户权限 <br />
exec sp_change_users_login 'update_one','newname','oldname' <br />
go <br />
（五）检查备份集 <br />
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' <br />
（六）修复数据库 <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 />
<br />
--CHECKDB 有3个参数: <br />
--REPAIR_ALLOW_DATA_LOSS <br />
--执行由 REPAIR_REBUILD 完成的所有修复，包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误，以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复，则数据库仍会含有错误，应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复，则将遗漏任何取决于该修复的修复。修复完成后，备份数据库。 <br />
--REPAIR_FAST 进行小的、不耗时的修复操作，如修复非聚集索引中的附加键。这些修复可以很快完成，并且不会有丢失数据的危险。 <br />
--REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复，包括需要较长时间的修复（如重建索引）。执行这些修复时不会有丢失数据的危险。 <br />
--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY <br />
SQL SERVER日志清除的两种方法 <br />
在使用过程中大家经常碰到数据库日志非常大的情况，在这里介绍了两种处理方法&#8230;&#8230; <br />
方法一 <br />
一般情况下，SQL数据库的收缩并不能很大程度上减小数据库大小，其主要作用是收缩日志大小，应当定期进行此操作以免数据库日志过大 <br />
1、设置数据库模式为简单模式：打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的<a title="服务器" href="http://www.vipcn.com/InfoList/Catalog_37_1.html" target="_blank">服务器</a>--&gt;双击打开数据库目录--&gt;选择你的数据库名称（如论坛数据库Forum）--&gt;然后点击右键选择属性--&gt;选择选项--&gt;在故障还原的模式中选择&#8220;简单&#8221;，然后按确定保存 <br />
2、在当前数据库上点右键，看所有任务中的收缩数据库，一般里面的默认设置不用调整，直接点确定 <br />
3、收缩数据库完成后，建议将您的数据库属性重新设置为标准模式，操作方法同第一点，因为日志在一些异常情况下往往是恢复数据库的重要依据 <br />
方法二 <br />
SET NOCOUNT ON <br />
DECLARE @LogicalFileName sysname, <br />
 @MaxMinutes INT, <br />
 @NewSize INT <br />
<br />
USE tablename -- 要操作的数据库名 <br />
SELECT@LogicalFileName = 'tablename_log',-- 日志文件名 <br />
@MaxMinutes = 10, -- Limit on time allowed to wrap log. <br />
 @NewSize = 1-- 你想设定的日志文件的大小(M) <br />
-- Setup / initialize <br />
DECLARE @OriginalSize int <br />
SELECT @OriginalSize = size <br />
FROM sysfiles <br />
WHERE name = @LogicalFileName <br />
SELECT 'Original Size of ' + db_name() + ' LOG is ' + <br />
 CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + <br />
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' <br />
FROM sysfiles <br />
WHERE name = @LogicalFileName <br />
CREATE TABLE DummyTrans <br />
(DummyColumn char (8000) not null) <br />
<br />
DECLARE @Counter INT, <br />
 @StartTime DATETIME, <br />
 @TruncLogVARCHAR(255) <br />
SELECT@StartTime = GETDATE(), <br />
 @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' <br />
DBCC SHRINKFILE (@LogicalFileName, @NewSize) <br />
EXEC (@TruncLog) <br />
-- Wrap the log if necessary. <br />
WHILE @MaxMinutes &gt; DATEDIFF (mi, @StartTime, GETDATE()) -- time has not e<a title="XP技巧 XP秘笈" href="http://www.vipcn.com/InfoList/Catalog_26_1.html" target="_blank">XP</a>ired <br />
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) <br />
 AND (@OriginalSize * 8 /1024) &gt; @NewSize <br />
BEGIN -- Outer loop. <br />
 SELECT @Counter = 0 <br />
 WHILE((@Counter &lt; @OriginalSize / 16) AND (@Counter &lt; 50000)) <br />
 BEGIN -- update <br />
 INSERT DummyTrans VALUES ('Fill Log') <br />
 DELETE DummyTrans <br />
 SELECT @Counter = @Counter + 1 <br />
 END <br />
 EXEC (@TruncLog) <br />
END <br />
SELECT 'Final Size of ' + db_name() + ' LOG is ' + <br />
 CONVERT(VARCHAR(30),size) + ' 8K pages or ' + <br />
 CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' <br />
FROM sysfiles <br />
WHERE name = @LogicalFileName <br />
DROP TABLE DummyTrans <br />
SET NOCOUNT OFF <br />
<br />
<br />
删除数据库中重复数据的几个方法 <br />
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据，重复数据导致了数据库部分设置不能正确设置&#8230;&#8230; <br />
方法一 <br />
declare @max integer,@id integer <br />
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) &gt; 1 <br />
open cur_rows <br />
fetch cur_rows into @id,@max <br />
while @@fetch_status=0 <br />
begin <br />
select @max = @max -1 <br />
set rowcount @max <br />
delete from 表名 where 主字段 = @id <br />
fetch cur_rows into @id,@max <br />
end <br />
close cur_rows <br />
set rowcount 0 <br />
方法二 <br />
有两个意义上的重复记录，一是完全重复的记录，也即所有字段均重复的记录，二是部分关键字段重复的记录，比如Name字段重复，而其他字段不一定重复或都重复可以忽略。 <br />
1、对于第一种重复，比较容易解决，使用 <br />
 select distinct * from tableName <br />
就可以得到无重复记录的结果集。 <br />
如果该表需要删除重复的记录（重复记录保留1条），可以按以下方法删除 <br />
 select distinct * into #Tmp from tableName <br />
 drop table tableName <br />
 select * into tableName from #Tmp <br />
 drop table #Tmp <br />
发生这种重复的原因是表设计不周产生的，增加唯一索引列即可解决。 <br />
2、这类重复问题通常要求保留重复记录中的第一条记录，操作方法如下 <br />
 假设有重复的字段为Name,Address，要求得到这两个字段唯一的结果集 <br />
 select identity(int,1,1) as autoID, * into #Tmp from tableName <br />
 select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID <br />
 select * from #Tmp where autoID in(select autoID from #tmp2) <br />
 最后一个select即得到了Name，Address不重复的结果集（但多了一个autoID字段，实际写时可以写在select子句中省去此列） <br />
<br />
<br />
更改数据库中表的所属用户的两个方法 <br />
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了，原因是建表的时候采用了当时的数据库用户&#8230;&#8230; <br />
<br />
--更改某个表 <br />
exec sp_changeobjectowner 'tablename','dbo' <br />
<br />
--<a title="存储相关资讯" href="http://www.vipcn.com/InfoList/Catalog_246_1.html" target="_blank">存储</a>更改全部表 <br />
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch <br />
@OldOwner as NVARCHAR(128), <br />
@NewOwner as NVARCHAR(128) <br />
AS <br />
DECLARE @Name as NVARCHAR(128) <br />
DECLARE @Owneras NVARCHAR(128) <br />
DECLARE @OwnerNameas NVARCHAR(128) <br />
DECLARE curObject CURSOR FOR <br />
select 'Name' = name, <br />
'Owner' = user_name(uid) <br />
from sysobjects <br />
where user_name(uid)=@OldOwner <br />
order by name <br />
OPENcurObject <br />
FETCH NEXT FROM curObject INTO @Name, @Owner <br />
WHILE(@@FETCH_STATUS=0) <br />
BEGIN <br />
if @Owner=@OldOwner <br />
begin <br />
set @OwnerName = @OldOwner + '.' + rtrim(@Name) <br />
exec sp_changeobjectowner @OwnerName, @NewOwner <br />
end <br />
-- select @name,@NewOwner,@OldOwner <br />
FETCH NEXT FROM curObject INTO @Name, @Owner <br />
END <br />
close curObject <br />
deallocate curObject <br />
<br />
GO <br />
<br />
SQL SERVER中直接循环写入数据 <br />
没什么好说的了，大家自己看，有时候有点用处 <br />
declare @i int <br />
set @i=1 <br />
while @i&lt;30 <br />
begin <br />
insert into test (userid) values(@i) <br />
set @i=@i+1 <br />
end <br />
<br />
<br />
无数据库日志文件恢复数据库方法两则 <br />
数据库日志文件的误删或别的原因引起数据库日志的损坏 <br />
<br />
方法一 <br />
1.新建一个同名的数据库 <br />
2.再停掉sql server(注意不要分离数据库) <br />
3.用原数据库的数据文件覆盖掉这个新建的数据库 <br />
4.再重启sql server <br />
5.此时打开企业管理器时会出现置疑，先不管，执行下面的语句（注意修改其中的数据库名) <br />
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用 <br />
数据库的脚本创建一个新的数据库,并将数据导进去就行了. <br />
USE MASTER <br />
GO <br />
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE <br />
GO <br />
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名' <br />
Go <br />
sp_dboption '置疑的数据库名', 'single user', 'true' <br />
Go <br />
DBCC CHECKDB('置疑的数据库名') <br />
Go <br />
update sysdatabases set status =28 where name='置疑的数据库名' <br />
Go <br />
sp_configure 'allow updates', 0 reconfigure with override <br />
Go <br />
sp_dboption '置疑的数据库名', 'single user', 'false' <br />
Go <br />
方法二 <br />
事情的起因 <br />
昨天，系统管理员告诉我，我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB，于是我决意缩小这个日志文件。经过收缩数据库等操作未果后，我犯了一个自进入行业以来的最大最愚蠢的错误：竟然误删除了这个日志文件！后来我看到所有论及数据库恢复的文章上妓档溃骸拔蘼廴绾味家Ｖ?a href="<a href='http://hackbase.com/hacker"' target="_blank" href_cetemp='http://hackbase.com/hacker"'>http://hackbase.com/hacker"</a> target="_blank"&gt;数据库日志文件存在，它至关重要&#8221;，甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的？！ <br />
这下子坏了！这个数据库连不上了，企业管理器在它的旁边写着&#8220;(置疑)&#8221;。而且最要命的，这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器，应用倒是能用了，但是少了许多记录、表和存储过程。真希望这只是一场噩梦！ <br />
没有效果的恢复步骤 <br />
附加数据库 <br />
_Rambo讲过被删除日志文件中不存在活动日志时，可以这么做来恢复： <br />
1，分离被置疑的数据库，可以使用sp_detach_db <br />
2，附加数据库，可以使用sp_attach_single_file_db <br />
但是，很遗憾，执行之后，SQL Server质疑数据文件和日志文件不符，所以无法附加数据库数据文件。 <br />
DTS数据导出 <br />
不行，无法读取XXX数据库，DTS Wizard报告说&#8220;初始化上下文发生错误&#8221;。 <br />
紧急模式 <br />
怡红公子讲过没有日志用于恢复时，可以这么做： <br />
1，把数据库设置为emergency mode <br />
2，重新建立一个log文件 <br />
3，把SQL Server 重新启动一下 <br />
4，把应用数据库设置成单用户模式 <br />
5，做DBCC CHECKDB <br />
6，如果没有什么大问题就可以把数据库状态改回去了，记得别忘了把系统表的修改选项关掉 <br />
<br />
我实践了一下，把应用数据库的数据文件移走，重新建立一个同名的数据库XXX，然后停掉SQL服务，把原来的数据文件再覆盖回来。之后，按照怡红公子的步骤走。 <br />
但是，也很遗憾，除了第2步之外，其他步骤执行非常<a title="成功技巧" href="http://www.vipcn.com/InfoList/Catalog_213_1.html" target="_blank">成功</a>。可惜，重启SQL Server之后，这个应用数据库仍然是置疑！ <br />
不过，让我欣慰的是，这么做之后，倒是能够Select数据了，让我大出一口气。只不过，组件使用数据库时，报告说：&#8220;发生错误：-2147467259,未能在数据库 'XXX' 中运行 BEGIN TRANSACTION，因为该数据库处于回避恢复模式。&#8221; <br />
<br />
最终成功恢复的全部步骤 <br />
设置数据库为紧急模式 <br />
 停掉SQL Server服务； <br />
把应用数据库的数据文件XXX_Data.mdf移走； <br />
 重新建立一个同名的数据库XXX； <br />
停掉SQL服务； <br />
 把原来的数据文件再覆盖回来； <br />
运行以下语句，把该数据库设置为紧急模式； <br />
 运行&#8220;Use Master <br />
Go <br />
sp_configure 'allow updates', 1 <br />
reconfigure with override <br />
Go&#8221; <br />
执行结果： <br />
DBCC 执行完毕。如果 DBCC 输出了错误信息，请与系统管理员联系。 <br />
已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。 <br />
<br />
接着运行&#8220;update sysdatabases set status = 32768 where name = 'XXX'&#8221; <br />
执行结果： <br />
（所影响的行数为 1 行） <br />
<br />
 重启SQL Server服务； <br />
运行以下语句，把应用数据库设置为Single User模式； <br />
 运行&#8220;sp_dboption 'XXX', 'single user', 'true'&#8221; <br />
执行结果： <br />
 命令已成功完成。 <br />
<br />
&#252; 做DBCC CHECKDB； <br />
 运行&#8220;DBCC CHECKDB('XXX')&#8221; <br />
执行结果： <br />
'XXX' 的 DBCC 结果。 <br />
'sysobjects' 的 DBCC 结果。 <br />
对象 'sysobjects' 有 273 行，这些行位于 5 页中。 <br />
'sysindexes' 的 DBCC 结果。 <br />
对象 'sysindexes' 有 202 行，这些行位于 7 页中。 <br />
'syscolumns' 的 DBCC 结果。 <br />
&#8230;&#8230;&#8230; <br />
<br />
&#252; 运行以下语句把系统表的修改选项关掉； <br />
 运行&#8220;sp_resetstatus "XXX" <br />
go <br />
sp_configure 'allow updates', 0 <br />
reconfigure with override <br />
Go&#8221; <br />
执行结果： <br />
在 sysdatabases 中更新数据库 'XXX' 的条目之前，模式 = 0，状态 = 28（状态 suspect_bit = 0）， <br />
没有更新 sysdatabases 中的任何行，因为已正确地重置了模式和状态。没有错误，未进行任何更改。 <br />
DBCC 执行完毕。如果 DBCC 输出了错误信息，请与系统管理员联系。 <br />
已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。 <br />
<br />
 重新建立另外一个数据库XXX.Lost； <br />
DTS导出向导 <br />
运行DTS导出向导； <br />
复制源选择EmergencyMode的数据库XXX，导入到XXX.Lost； <br />
 选择&#8220;在SQL Server数据库之间复制对象和数据&#8221;，试了多次，好像不行，只是复制过来了所有表结构，但是没有数据，也没有视图和存储过程，而且DTS向导最后报告复制失败； <br />
所以最后选择&#8220;从源数据库复制表和视图&#8221;，但是后来发现，这样总是只能复制一部分表记录； <br />
 于是选择&#8220;用一条查询指定要传输的数据&#8221;，缺哪个表记录，就导哪个； <br />
 视图和存储过程是执行SQL语句添加的。 <br />
<br />
维护Sql Server中表的索引 <br />
在使用和创建数据库索引中经常会碰到一些问题，在这里可以采用一些另类的方法解决&#8230; <br />
--第一步：查看是否需要维护，查看扫描密度/Scan Density是否为100% <br />
declare @table_id int <br />
set @table_id=object_id('表名') <br />
dbcc showcontig(@table_id) <br />
--第二步:重构表索引 <br />
dbcc dbreindex('表名',pk_索引名,100) <br />
--重做第一步，如发现扫描密度/Scan Density还是小于100%则重构表的所有索引 <br />
--杨铮：并不一定能达100%。 <br />
dbcc dbreindex('表名','',100) <br />
<br />
SQL Server补丁安装常见问题 <br />
谁碰到问题就看看咯：） <br />
一、补丁安装过程中常见问题 <br />
<br />
如果在安装补丁的时候遇到如下类似错误： <br />
1、安装过程中出现&#8220;以前进行的程序创建了挂起的文件操作，运行安装程序前，必须重新启动&#8221;，请按照下面步骤解决： <br />
a、重启机器，再进行安装，如果发现还有该错误，请按下面步骤 <br />
b、在开始-&gt;运行中<a title="输入法技巧" href="http://www.vipcn.com/InfoList/Catalog_35_1.html" target="_blank">输入</a>regedit <br />
c、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 位置 <br />
d、选择文件-&gt;倒出,保存 <br />
e、在右边窗口右击PendingFileRenameOperations，选择删除，然后确认 <br />
f、重启安装，问题解决 <br />
如果还有同样问题，请检查其它<a title="注册表相关知识技巧" href="http://www.vipcn.com/InfoList/Catalog_31_1.html" target="_blank">注册表</a>中是否有该值存在，如有请删掉。 <br />
2、在安装SQL Server SP3，有时候会出现：无论用windows<a title="网络考试认证" href="http://www.vipcn.com/InfoList/Catalog_7_1.html" target="_blank">认证</a>还是混和认证，都出现密码错误的情况，这时查看临时目录下的sqlsp.out，会发现以下描述： <br />
[TCP/IP Sockets]Specified SQL server not found. <br />
[TCP/IP Sockets]ConnectionOpen (Connect()). <br />
其实这是SQL Server SP3的一个小bug，在安装sp3的时候，没有监听tcp/ip端口，可以按照以下步骤进行： <br />
1、打开SQL server客户器网络实用工具和服务器网络工具，确保启用的协议中包含name pipe，并且位置在第一位. <br />
2、确保[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\<a title="MSSQL" href="http://www.vipcn.com/InfoList/Catalog_132_1.html" target="_blank">MSSQL</a>Server\Client\ConnectTo] <br />
"DSQUERY"="DBNETLIB". <br />
如果没有，请自己建立 <br />
3、停止mssql. <br />
4、进行安装. <br />
这样就可以进行正确安装了。 <br />
二、SQL Server补丁版本的检查 <br />
SQL Server的补丁版本检查不如Windows 补丁版本检查直接，一个系统管理员，如果不了解SQL Server版本对应的补丁号，可能也会遇到一点麻烦，因此在这说明一下，通过这样的办法判别机器是<a title="网络安全资讯" href="http://www.vipcn.com/InfoList/Catalog_59_1.html" target="_blank">安全</a>的办法，不会对系统产生任何影响。 <br />
1、用Isql或者SQL查询分析器登录到SQL Server，如果是用Isql，请在cmd窗口输入isql -U sa,然后输入密码，进入；如果是用SQL查询分析器，请从程序中启动，输入sa和密码（也可以用windows验证）。 <br />
2、在ISQL中输入： <br />
Select @@Version； <br />
<br />
go <br />
或者SQL查询分析器中输入(其实如果不想输入，只要打开帮助的关于就可以了:)) <br />
Select @@Version； <br />
然后按执行； <br />
这时会返回SQL的版本信息，如下： <br />
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3) <br />
其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下： <br />
8.00.194 －——————SQL Server 2000 RTM <br />
8.00.384 －——————(SP1) <br />
8.00.534 －——————(SP2) <br />
8.00.760 －——————(SP3) <br />
这样我们就能看到SQL Server的正确版本和补丁号了。 <br />
我们也可以用xp_msver看到更详细的信息 <br />
<br />
Sql Server数据库的备份和恢复措施 <br />
最常用的操作，新手们看看&#8230;&#8230; <br />
一、备份数据库 <br />
<br />
1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server <br />
2、SQL Server组--&gt;双击打开你的服务器--&gt;双击打开数据库目录 <br />
3、选择你的数据库名称（如论坛数据库Forum）--&gt;然后点上面菜单中的工具--&gt;选择备份数据库 <br />
4、备份选项选择完全备份，目的中的备份到如果原来有路径和名称则选中名称点删除，然后点添加，如果原来没有路径和名称则直接选择添加，接着指定路径和文件名，指定后点确定返回备份窗口，接着点确定进行备份 <br />
<br />
二、还原数据库 <br />
<br />
1、打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server <br />
2、SQL Server组--&gt;双击打开你的服务器--&gt;点图标栏的新建数据库图标，新建数据库的名字自行取 <br />
3、点击新建好的数据库名称（如论坛数据库Forum）--&gt;然后点上面菜单中的工具--&gt;选择恢复数据库 <br />
4、在弹出来的窗口中的还原选项中选择从设备--&gt;点选择设备--&gt;点添加--&gt;然后选择你的备份文件名--&gt;添加后点确定返回，这时候设备栏应该出现您刚才选择的数据库备份文件名，备份号默认为1（如果您对同一个文件做过多次备份，可以点击备份号旁边的查看内容，在复选框中选择最新的一次备份后点确定）--&gt;然后点击上方常规旁边的选项按钮 <br />
5、在出现的窗口中选择在现有数据库上强制还原，以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置（也可以指定自己的目录），逻辑文件名不需要改动，移至物理文件名要根据你所恢复的机器情况做改动，如您的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\Data，那么就按照您恢复机器的目录进行相关改动改动，并且最后的文件名最好改成您当前的数据库名（如原来是bbs_data.mdf，现在的数据库是forum，就改成forum_data.mdf），日志和数据文件都要按照这样的方式做相关的改动（日志的文件名是*_log.ldf结尾的），这里的恢复目录您可以自由设置，前提是该目录必须存在（如您可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldf），否则恢复将报错 <br />
6、修改完成后，点击下面的确定进行恢复，这时会出现一个进度条，提示恢复的进度，恢复完成后系统会自动提示成功，如中间提示报错，请记录下相关的错误内容并询问对SQL操作比较熟悉的人员，一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误，数据库正在使用的错误您可以尝试关闭所有关于SQL窗口然后重新打开进行恢复操作，如果还提示正在使用的错误可以将SQL服务停止然后重起看看，至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复 <br />
<br />
三、收缩数据库 <br />
<br />
一般情况下，SQL数据库的收缩并不能很大程度上减小数据库大小，其主要作用是收缩日志大小，应当定期进行此操作以免数据库日志过大 <br />
1、设置数据库模式为简单模式：打开SQL企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器--&gt;双击打开数据库目录--&gt;选择你的数据库名称（如论坛数据库Forum）--&gt;然后点击右键选择属性--&gt;选择选项--&gt;在故障还原的模式中选择&#8220;简单&#8221;，然后按确定保存 <br />
2、在当前数据库上点右键，看所有任务中的收缩数据库，一般里面的默认设置不用调整，直接点确定 <br />
3、收缩数据库完成后，建议将您的数据库属性重新设置为标准模式，操作方法同第一点，因为日志在一些异常情况下往往是恢复数据库的重要依据 <br />
<br />
四、设定每日自动备份数据库 <br />
<br />
强烈建议有条件的用户进行此操作！ <br />
1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器 <br />
2、然后点上面菜单中的工具--&gt;选择数据库维护计划器 <br />
3、下一步选择要进行自动备份的数据--&gt;下一步更新数据优化信息，这里一般不用做选择--&gt;下一步检查数据完整性，也一般不选择 <br />
4、下一步指定数据库维护计划，默认的是1周备份一次，点击更改选择每天备份后点确定 <br />
5、下一步指定备份的磁盘目录，选择指定目录，如您可以在D盘新建一个目录如：d:\databak，然后在这里选择使用此目录，如果您的数据库比较多最好选择为每个数据库建立子目录，然后选择删除早于多少天前的备份，一般设定4－7天，这看您的具体备份要求，备份文件扩展名一般都是bak就用默认的 <br />
6、下一步指定事务日志备份计划，看您的需要做选择--&gt;下一步要生成的报表，一般不做选择--&gt;下一步维护计划历史记录，最好用默认的选项--&gt;下一步完成 <br />
7、完成后系统很可能会提示Sql Server Agent服务未启动，先点确定完成计划设定，然后找到桌面最右边状态栏中的SQL绿色图标，双击点开，在服务中选择Sql Server Agent，然后点击运行箭头，选上下方的当启动OS时自动启动服务 <br />
8、这个时候数据库计划已经成功的运行了，他将按照您上面的设置进行自动备份 <br />
<br />
修改计划： <br />
1、打开企业管理器，在控制台根目录中依次点开Microsoft SQL Server--&gt;SQL Server组--&gt;双击打开你的服务器--&gt;管理--&gt;数据库维护计划--&gt;打开后可看到你设定的计划，可以进行修改或者删除操作 <br />
五、数据的转移（新建数据库或转移服务器） <br />
<br />
一般情况下，最好使用备份和还原操作来进行转移数据，在特殊情况下，可以用导入导出的方式进行转移，这里介绍的就是导入导出方式，导入导出方式转移数据一个作用就是可以在收缩数据库无效的情况下用来减小（收缩）数据库的大小，本操作默认为您对SQL的操作有一定的了解，如果对其中的部分操作不理解，可以咨询动网相关人员或者查询网上资料 <br />
1、将原数据库的所有表、存储过程导出成一个SQL文件，导出的时候注意在选项中选择编写索引脚本和编写主键、外键、默认值和检查约束脚本选项 <br />
2、新建数据库，对新建数据库执行第一步中所建立的SQL文件 <br />
3、用SQL的导入导出方式，对新数据库导入原数据库中的所有表内容 <br />
<br />
利用数据库日志恢复数据到时间点的操作 <br />
由于不正常的数据丢失，而又不想使用备份数据还原，只要原来有备份且当前日志保存完好，可以采用这个方法试试，说不定可挽回损失&#8230;&#8230; <br />
1，如果误操作之前存在一个全库备份（或已有多个差异备份或增量备份），首先要做的事就是进 <br />
进行一次日志备份（如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了） <br />
 backup log dbName to disk='fileName' <br />
2，恢复一个全库备份，注意需要使用with norecovery，如果还有其他差异或增量备份，则逐个恢 <br />
复 <br />
 restore database dbName from disk='fileName' with norecovery <br />
3，恢复最后一个日志备份即刚做的日志备份，指定恢复时间点到误操作之前的时刻 <br />
 restore log dbName from disk='fileName' <br />
 with stopat='date_time' <br />
<br />
以上这些操作都可以在SQL SERVER企业管理器里完成，难度不大。。。 <br />
<br />
当然，如果误操作是一些不记日志的操作比如truncate table，select into等操作，那么是无法利 <br />
用上述方法来恢复数据的... <br />
<br />
SQL Server2000数据库文件损坏时如何恢复 <br />
出现这样的问题是比较严重的了，能否修复只能看你的运气&#8230;&#8230; <br />
SQL Server2000中，如果数据库文件（非系统数据库文件）遇到错误的时候，仅适用于非master,msdb的数据库。 <br />
说明如下： <br />
1 建一个测试数据库test(数据库类型为完全) <br />
2 建一个表，插入点记录 <br />
create table a(c1 varchar(2)) <br />
go <br />
insert into a values('aa') <br />
go <br />
insert into a values('bb') <br />
go <br />
3 作完全备份，到文件test_1.bak <br />
4 在作一点修改 <br />
insert into a values('cc') <br />
go <br />
create table b(c1 int) <br />
go <br />
insert into b values(1) <br />
go <br />
insert into b values(2) <br />
go <br />
5 shutdown 数据库服务器 <br />
6 用ultraedit编辑数据库文件test_data.mdf,随便修改点字节内容,相当于数据库遭到致命的损坏。 <br />
7 启动数据库，并且运行企业管理器，点开数据库，看到test变成灰色，而且显示置疑。 <br />
8 运行isql -SLocalhost -Usa -P <br />
1&gt; backup log test TO DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKUP <br />
est_2.bak' WITH NO_TRUNCATE <br />
2&gt;go <br />
已处理 2 页，这些页属于数据库 'test' 的文件 'TEST_Log'（位于文件 1 上）。 <br />
BACKUP LOG 操作成功地处理了 2 页，花费了 0.111 秒（0.087 MB/秒）。 <br />
9 进行恢复最老的完全备份 <br />
1&gt; RESTORE DATABASE test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQL <br />
BACKUP est_1.bak' WITH NORECOVERY <br />
2&gt; go <br />
已处理 96 页，这些页属于数据库 'test' 的文件 'TEST_Data'（位于文件 1 上）。 <br />
已处理 1 页，这些页属于数据库 'test' 的文件 'TEST_Log'（位于文件 1 上）。 <br />
RESTORE DATABASE 操作成功地处理了 97 页，花费了 0.107 秒（7.368 MB/秒）。 <br />
10 恢复最近的日志 <br />
1&gt; RESTORE LOG test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKU <br />
P est_2.bak' WITH RECOVERY <br />
2&gt; go <br />
已处理 2 页，这些页属于数据库 'test' 的文件 'TEST_Log'（位于文件 1 上）。 <br />
RESTORE LOG 操作成功地处理了 2 页，花费了 0.056 秒（0.173 MB/秒）。 <br />
<br />
<br />
<br />
存储过程编写经验和优化措施 <br />
经验之谈，看看&#8230;&#8230; <br />
一、适合读者对象：数据库开发程序员，数据库的数据量很多，涉及到对SP（存储过程）的优化的项目开发人员，对数据库有浓厚兴趣的人。 　 <br />
<br />
　　二、介绍：在数据库的开发过程中，经常会遇到复杂的业务逻辑和对数据库的操作，这个时候就会用SP来封装数据库操作。如果项目的SP较多，书写又没有一定的规范，将会影响以后的系统维护困难和大SP逻辑的难以理解，另外如果数据库的数据量大或者项目对SP的性能要求很，就会遇到优化的问题，否则速度有可能很慢，经过亲身经验，一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。 　 <br />
<br />
　　三、内容： 　 <br />
<br />
　　1、开发人员如果用到其他库的Table或View，务必在当前库中建立View来实现跨库操作，最好不要直接使用&#8220;databse.dbo.table_name&#8221;，因为sp_depends不能显示出该SP所使用的跨库table或view，不方便校验。　　 <br />
<br />
　　2、开发人员在提交SP前，必须已经使用set showplan on分析过查询计划，做过自身的查询优化检查。 　 <br />
<br />
　　3、高程序运行效率，优化应用程序，在SP编写过程中应该注意以下几点： 　　 <br />
<br />
　　a)SQL的使用规范： <br />
　　i.　尽量避免大事务操作，慎用holdlock子句，提高系统并发能力。 <br />
<br />
　　　ii.　尽量避免反复访问同一张或几张表，尤其是数据量较大的表，可以考虑先根据条件提取数据到临时表中，然后再做连接。 <br />
<br />
　　　iii.　尽量避免使用游标，因为游标的效率较差，如果游标操作的数据超过1万行，那么就应该改写；如果使用了游标，就要尽量避免在游标循环中再进行表连接的操作。 <br />
<br />
　　　iv.　注意where字句写法，必须考虑语句顺序，应该根据索引顺序、范围大小来确定条件子句的前后顺序，尽可能的让字段顺序与索引顺序相一致，范围从大到小。 <br />
<br />
　　　v.　不要在where子句中的&#8220;=&#8221;左边进行函数、算术运算或其他表达式运算，否则系统将可能无法正确使用索引。 <br />
<br />
　　　vi.　尽量使用exists代替select count(1)来判断是否存在记录，count函数只有在统计表中所有行数时使用，而且count(1)比count(*)更有效率。 <br />
<br />
　　　vii.　尽量使用&#8220;&gt;=&#8221;，不要使用&#8220;&gt;&#8221;。 <br />
<br />
　　　viii.　注意一些or子句和union子句之间的替换 <br />
<br />
　　　ix.　注意表之间连接的数据类型，避免不同类型数据之间的连接。 <br />
<br />
　　　x.　注意存储过程中参数和数据类型的关系。 <br />
<br />
　　　xi.　注意insert、update操作的数据量，防止与其他应用冲突。如果数据量超过200个数据页面（400k），那么系统将会进行锁升级，页级锁会升级成表级锁。 　　 <br />
<br />
　　b)索引的使用规范： <br />
<br />
　　　i.　索引的创建要与应用结合考虑，建议大的OLTP表不要超过6个索引。 <br />
<br />
　　　ii.　尽可能的使用索引字段作为查询条件，尤其是聚簇索引，必要时可以通过index index_name来强制指定索引 <br />
<br />
　　　iii.　避免对大表查询时进行table scan，必要时考虑新建索引。 <br />
<br />
　　　iv.　在使用索引字段作为条件时，如果该索引是联合索引，那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引，否则该索引将不会被使用。 <br />
<br />
　　　v.　要注意索引的维护，周期性重建索引，重新编译存储过程。　　 <br />
<br />
　　c)tempdb的使用规范： <br />
<br />
　　　i.　尽量避免使用distinct、order by、group by、having、join、cumpute，因为这些语句会加重tempdb的负担。 <br />
<br />
　　　ii.　避免频繁创建和删除临时表，减少系统表资源的消耗。 <br />
<br />
　　　iii.　在新建临时表时，如果一次性插入数据量很大，那么可以使用select into代替create table，避免log，提高速度；如果数据量不大，为了缓和系统表的资源，建议先create table，然后insert。 <br />
<br />
　　　iv.　如果临时表的数据量较大，需要建立索引，那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中，这样才能保证系统能够很好的使用到该临时表的索引。 <br />
<br />
　　　 v.　如果使用到了临时表，在存储过程的最后务必将所有的临时表显式删除，先truncate table，然后drop table，这样可以避免系统表的较长时间锁定。 <br />
<br />
　　　 vi.　慎用大的临时表与其他大表的连接查询和修改，减低系统表负担，因为这种操作会在一条语句中多次使用tempdb的系统表。　　 <br />
<br />
　　d)合理的算法使用： 　　 <br />
<br />
　　根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令：set statistics io on, set statistics time on , set showplan on 等 <br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:29 <a href="http://www.blogjava.net/WshmAndLily/articles/152251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技巧：SQL Server 2005对海量数据处理的实现</title><link>http://www.blogjava.net/WshmAndLily/articles/152248.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152248.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152248.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152248.html</trackback:ping><description><![CDATA[超大型数据库的大小常常达到数百GB，有时甚至要用TB来计算。而单表的数据量往往会达到上亿的记录，并且记录数会随着时间而增长。这不但影响着数据库的运行效率，也增大数据库的维护难度。除了表的数据量外，对表不同的访问模式也可能会影响性能和可用性。这些问题都可以通过对大表进行合理分区得到很大的改善。当表和索引变得非常大时，分区可以将数据分为更小、更容易管理的部分来提高系统的运行效率。如果系统有多个CPU或是多个磁盘子系统，可以通过并行操作获得更好的性能。所以对大表进行分区是处理海量数据的一种十分高效的方法。本文通过一个具体实例，介绍如何创建和<a title="电脑硬件维修" href="http://www.vipcn.com/InfoList/Catalog_138_1.html" target="_blank">修</a>改分区表，以及如何查看分区表。
<p>　　<strong>1 SQL Server 2005</strong></p>
<p>　　SQL Server 2005是微软在推出SQL Server 2000后时隔五年推出的一个数据库平台，它的数据库引擎为关系型数据和结构化数据提供了更<a title="网络安全资讯" href="http://www.vipcn.com/InfoList/Catalog_59_1.html" target="_blank">安全</a>可靠的<a title="存储相关资讯" href="http://www.vipcn.com/InfoList/Catalog_246_1.html" target="_blank">存储</a>功能，使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。此外SQL Server 2005结合了分析、报表、集成和通知功能。这使企业可以构建和部署经济有效的BI解决方案，帮助团队通过记分卡、Dashboard、Web Services和移动设备将数据应用推向业务的各个领域。无论是开发人员、数据库管理员、信息工作者还是决策者，SQL Server 2005都可以提供出创新的解决方案，并可从数据中获得更多的益处。</p>
<p>　　它所带来的新特性，如T-SQL的增强、数据分区、服务<a title="代理相关知识技巧" href="http://www.vipcn.com/InfoList/Catalog_39_1.html" target="_blank">代理</a>和与.Net Framework的集成等，在易管理性、可用性、可伸缩性和安全性等方面都有很大的增强。</p>
<p>　　<strong>2 表分区的具体实现方法</strong></p>
<p>　　表分区分为水平分区和垂直分区。水平分区将表分为多个表。每个表包含的列数相同，但是行更少。例如，可以将一个包含十亿行的表水平分区成 12 个表，每个小表表示特定年份内一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。而垂直分区则是将原始表分成多个只包含较少列的表。水平分区是最常用分区方式，本文以水平分区来介绍具体实现方法。</p>
<p>　　水平分区常用的方法是根据时期和使用对数据进行水平分区。例如本文例子，一个短信发送记录表包含最近一年的数据，但是只定期访问本季度的数据。在这种情况下，可考虑将数据分成四个区，每个区只包含一个季度的数据。</p>
<p>　　2.1 创建文件组</p>
<p>　　建立分区表先要创建文件组，而创建多个文件组主要是为了获得好的 I/O 平衡。一般情况下，文件组数最好与分区数相同，并且这些文件组通常位于不同的磁盘上。每个文件组可以由一个或多个文件构成，而每个分区必须映射到一个文件组。一个文件组可以由多个分区使用。为了更好地管理数据(例如，为了获得更精确的备份控制)，对分区表应进行设计，以便只有相关数据或逻辑分组的数据位于同一个文件组中。使用 ALTER DATABASE，添加逻辑文件组名：</p>
<p>　　ALTER DATABASE [DeanDB] ADD FILEGROUP [FG1]</p>
<p>　　DeanDB为数据库名称，FG1文件组名。创建文件组后，再使用 ALTER DATABASE 将文件添加到该文件组中：</p>
<p>　　ALTER DATABASE [DeanDB] ADD FILE ( NAME = N'FG1', FILENAME = N'C:DeanDataFG1.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG1]</p>
<p>　　类似的建立四个文件和文件组，并把每一个存储数据的文件放在不同的磁盘<a title="驱动下载" href="http://www.vipcn.com/SoftList/Catalog_514_SoftTime_Desc_1.html" target="_blank">驱动</a>器里。</p>
<p>　　2.2 创建分区函数 </p>
<p>　　创建分区表必须先确定分区的功能机制，表进行分区的标准是通过分区函数来决定的。创建数据分区函数有RANGE &#8220;LEFT / RIGHT&#8221;两种选择。代表每个边界值在局部的哪一边。例如存在四个分区，则定义三个边界点值，并指定每个值是第一个分区的上边界 (LEFT) 还是第二个分区的下边界 (RIGHT)[1]。代码如下：</p>
<p>　　CREATE PARTITION FUNCTION [SendSMSPF](datetime)　AS RANGE RIGHT FOR VALUES ('20070401', '20070701', '20071001')</p>
<p>　　2.3 创建分区方案</p>
<p>　　创建分区函数后，必须将其与分区方案相关联，以便将分区指向至特定的文件组。就是定义实际存放数据的媒体与各数据块的对应关系。多个数据表可以共用相同的数据分区函数，一般不共用相同的数据分区方案。可以通过不同的分区方案，使用相同的分区函数，使不同的数据表有相同的分区条件，但存放在不同的媒介上。创建分区方案的代码如下：</p>
<p>　　CREATE PARTITION SCHEME [SendSMSPS] AS PARTITION [SendSMSPF] TO ([FG1], [FG2], [FG3], [FG4])</p>
<p>　　2.4 创建分区表</p>
<p>　　建立好分区函数和分区方案后，就可以创建分区表了。分区表是通过定义分区键值和分区方案相联系的。插入记录时，SQL SERVER会根据分区键值的不同，通过分区函数的定义将数据放到相应的分区。从而把分区函数、分区方案和分区表三者有机的结合起来。创建分区表的代码如下：</p>
<p>　　CREATE TABLE SendSMSLog</p>
<p>　　([ID] [int] IDENTITY(1,1) NOT NULL,</p>
<p>　　[IDNum] [nvarchar](50) NULL,</p>
<p>[SendContent] [text] NULL </p>
<p>&nbsp;</p>
<p>　　[SendDate] [datetime] NOT NULL,</p>
<p>　　) ON SendSMSPS(SendDate)</p>
<p>　　2.5 查看分区表信息</p>
<p>　　系统运行一段时间或者把以前的数据导入分区表后，我们需要查看数据的具体存储情况，即每个分区存取的记录数，那些记录存取在那个分区等。我们可以通过$partition.SendSMSPF来查看，代码如下：</p>
<p>　　SELECT $partition.SendSMSPF(o.SendDate)</p>
<p>　　AS [Partition Number]</p>
<p>　　, min(o.SendDate) AS [Min SendDate]</p>
<p>　　, max(o.SendDate) AS [Max SendDate]</p>
<p>　　, count(*) AS [Rows In Partition]</p>
<p>　　FROM dbo.SendSMSLog AS o</p>
<p>　　GROUP BY $partition.SendSMSPF(o.SendDate)</p>
<p>　　ORDER BY [Partition Number]</p>
<p>　　在查询分析器里执行以上脚本，结果如图1所示： </p>
<p>&nbsp;</p>
<p>　　图1　分区表信息</p>
<p>　　<img alt="技巧：SQL Server 2005对海量数据处理的实现" src="http://www.fpvision.com.cn/uploadImages/2007-7-10/20077102051453198.jpg" /></p>
<p>　　2.6 维护分区</p>
<p>　　分区的维护主要设计分区的添加、减少、合并和在分区间转换。可以通过ALTER PARTITION FUNCTION的选项SPLIT，MERGE和ALTER TABLE的选项SWITCH来实现。SPLIT会多增加一个分区，而MEGRE会合并或者减少分区，SWITCH则是逻辑地在组间转换分区。</p>
<p>　　<strong>3 性能对比</strong></p>
<p>　　我们对2650万数据，存储空间占用约4G的单表进行性能对比，测试环境为IBM365，CPU 至强2.7G*2、内存 16G、硬盘 136G*2，系统平台为Windows 2003 SP1+SQL Server 2005 SP1。测试结果如表1：</p>
<p>　　表1：分区和未分区性能对比表(单位：毫秒)</p>
<p>　　测试项目 分区 未分区</p>
<p>　　1 16546 61466</p>
<p>　　2 13 33</p>
<p>　　3 20140 61546</p>
<p>　　4 17140 61000</p>
<p>　　说明：</p>
<p>　　1：根据时间检索某一天记录所耗时间</p>
<p>　　2：单条记录插入所耗时间</p>
<p>　　3：根据时间删除某一天记录所耗时间</p>
<p>　　4：统计每月的记录数所需时间</p>
<p>　　从表1可以看出，对分区表进行操作比未分区的表要快，这是因为对分区表的操作采用了CPU和I/O的并行操作，检索数据的数据量也变小了，定位数据所耗时间变短。</p>
<p>　　<strong>4 结束语</strong></p>
<p>　　对海量数据的处理一直是一个令人头痛的问题。分离的技术是所有设计者们首先考虑的问题，不管是分离应用程序功能还是分离数据访问，如果加以了合理规划，都能十分有效的解决大数据表的运行效率低和维护成本高等问题。SQL Server 2005新增的表分区功能，可以对数据进行合理分区，当用户在访问部分数据时，SQL Server最佳化引擎可以根据数据的实体存放，找出最佳的执行方案，而不至于大海捞针。</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 10:22 <a href="http://www.blogjava.net/WshmAndLily/articles/152248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql 经典语句</title><link>http://www.blogjava.net/WshmAndLily/articles/152237.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Oct 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/152237.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/152237.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/152237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/152237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/152237.html</trackback:ping><description><![CDATA[<p>SQL分类： <br />
DDL—数据定义语言(CREATE，ALTER，DROP，DECLARE) <br />
DML—数据操纵语言(SELECT，DELETE，UPDATE，INSERT) <br />
DCL—数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)</p>
<p>首先,简要介绍基础语句：<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&#8230; from tab_old definition only<br />
5、说明：删除新表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&#8230;.) <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 &#8217;%value1%&#8217; ---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 />
全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。</p>
<p>其次，大家来看一些不错的sql语句<br />
1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)<br />
法一：select * into b from a where 1&lt;&gt;1<br />
法二：select top 0 * into b from a</p>
<p>2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b;</p>
<p>3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b in &#8216;具体数据库&#8217; where 条件<br />
例子：..from b in '"&amp;Server.MapPath(".")&amp;"\data.mdb" &amp;"' where.. </p>
<p>&nbsp;</p>
<p>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)</p>
<p>5、说明：显示文章、提交人和最后回复时间<br />
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b</p>
<p>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</p>
<p>7、说明：在线视图查询(表名1：a )<br />
select * from (SELECT a,b,c FROM a) T where t.a &gt; 1;</p>
<p>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</p>
<p>9、说明：in 的使用方法<br />
select * from table1 where a [not] in (&#8216;值1&#8217;,&#8217;值2&#8217;,&#8217;值4&#8217;,&#8217;值6&#8217;)</p>
<p>10、说明：两张关联表，删除主表中已经在副表中没有的信息 <br />
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )</p>
<p>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 .....</p>
<p>12、说明：日程安排提前五分钟提醒 <br />
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5</p>
<p>13、说明：一条sql 语句搞定数据库分页<br />
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段</p>
<p>14、说明：前10条记录<br />
select top 10 * form table1 where 范围</p>
<p>15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)<br />
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)</p>
<p>16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表<br />
(select a from tableA ) except (select a from tableB) except (select a from tableC)</p>
<p>17、说明：随机取出10条数据<br />
select top 10 * from tablename order by newid()</p>
<p>18、说明：随机选择记录<br />
select newid()</p>
<p>19、说明：删除重复记录<br />
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)</p>
<p>20、说明：列出数据库里所有的表名<br />
select name from sysobjects where type='U' </p>
<p>21、说明：列出表里的所有的<br />
select name from syscolumns where id=object_id('TableName')</p>
<p>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 />
<a title="手机 相关资讯" href="http://www.vipcn.com/DigiList/Catalog_1_1.html" target="_blank">手机</a> B 3<br />
手机 C 3</p>
<p>23、说明：初始化表table1<br />
TRUNCATE TABLE table1</p>
<p>24、说明：选择从10到15的记录<br />
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc<br />
　　<br />
随机选择数据库记录的方法（使用Randomize函数，通过SQL语句实现）<br />
　　对<a title="存储相关资讯" href="http://www.vipcn.com/InfoList/Catalog_246_1.html" target="_blank">存储</a>在数据库中的数据来说，随机数特性能给出上面的效果，但它们可能太慢了些。你不能要求<a title="ASP学习技巧教程" href="http://www.vipcn.com/InfoList/Catalog_10_1.html" target="_blank">ASP</a>&#8220;找个随机数&#8221;然后打印出来。实际上常见的解决方案是建立如下所示的循环： <br />
</p>
<p>Randomize <br />
RNumber = Int(Rnd*499) +1 <br />
　<br />
While Not objRec.EOF <br />
If objRec("ID") = RNumber THEN <br />
... 这里是执行脚本 ... <br />
end if <br />
objRec.MoveNext <br />
Wend <br />
　<br />
　　这很容易理解。首先，你取出1到500范围之内的一个随机数（假设500就是数据库内记录的总数）。然后，你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495，那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些，但相比更为稳固的企业解决方案这还是个小型数据库了，后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了？ <br />
　　采用SQL，你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset，如下所示： <br />
Randomize <br />
RNumber = Int(Rnd*499) + 1 <br />
　<br />
SQL = "SELECT * FROM Customers WHERE ID = " &amp; RNumber <br />
　<br />
set objRec = ObjConn.Execute(SQL) <br />
Response.WriteRNumber &amp; " = " &amp; objRec("ID") &amp; " " &amp; objRec("c_email") <br />
　<br />
　　不必写出RNumber 和ID，你只需要检查匹配情况即可。只要你对以上代码的工作满意，你自可按需操作&#8220;随机&#8221;记录。Recordset没有包含其他内容，因此你很快就能找到你需要的记录这样就大大降低了处理时间。 <br />
再谈随机数 <br />
　　现在你下定决心要榨干Random 函数的最后一滴油，那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 <br />
　　为了取出几条随机选择的记录并存放在同一recordset内，你可以存储三个随机数，然后查询数据库获得匹配这些数字的记录： <br />
SQL = "SELECT * FROM Customers WHERE ID = " &amp; RNumber &amp; " OR ID = " &amp; RNumber2 &amp; " OR ID = " &amp; RNumber3 <br />
　<br />
　　假如你想选出10条记录（也许是每次页面装载时的10条链接的列表），你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成，但是 SELECT 语句只显示一种可能（这里的ID 是自动生成的号码）： <br />
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " &amp; RNumber &amp; " AND " &amp; RNumber &amp; "+ 9" </p>
<p>&nbsp;</p>
<p>　　注意：以上代码的执行目的不是检查数据库内是否有9条并发记录。</p>
<p>　<br />
随机读取若干条记录，测试过<br />
Access语法：SELECT top 10 * From 表名 ORDER BY Rnd(id)<br />
Sql server:select top n * from 表名 order by newid()<br />
<a title="mysql" href="http://www.vipcn.com/InfoList/Catalog_135_1.html" target="_blank">mysql</a>elect * From 表名 Order By rand() Limit n<br />
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)<br />
语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...<br />
使用SQL语句 用...代替过长的字符串显示<br />
语法：<br />
SQL数据库：select case when len(field)&gt;10 then left(field,10)+'...' else field end as news_name,news_id from tablename<br />
Access数据库：SELECT iif(len(field)&gt;2,left(field,2)+'...',field) FROM tablename; <br />
　<br />
Conn.Execute说明<br />
Execute方法<br />
　　该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集，该方法的使用格式分为以下两种：<br />
　　　　1．执行SQL查询语句时，将返回查询得到的记录集。用法为：<br />
　　　　Set 对象变量名=连接对象.Execute("SQL 查询语言")<br />
　　　Execute方法调用后，会自动创建记录集对象，并将查询结果存储在该记录对象中，通过Set方法，将记录集赋给指定的对象保存，以后对象变量就代表了该记录集对象。</p>
<p>　　　　2．执行SQL的操作性语言时，没有记录集的返回。此时用法为：<br />
　　　　连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]<br />
　　　　　　&#183;RecordAffected 为可选项，此出可放置一个变量，SQL语句执行后，所生效的记录数会自动保存到该变量中。通过访问该变量，就可知道SQL语句队多少条记录进行了操作。<br />
　　　　　　&#183;Option 可选项，该参数的取值通常为adCMDText，它用于告诉ADO，应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数，可使执行更高效。</p>
<p>&#183;BeginTrans、RollbackTrans、CommitTrans方法<br />
　　这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物；RollbackTrans用于回滚事务；CommitTrans用于提交所有的事务处理结果，即确认事务的处理。<br />
　　事务处理可以将一组操作视为一个整体，只有全部语句都<a title="成功技巧" href="http://www.vipcn.com/InfoList/Catalog_213_1.html" target="_blank">成功</a>执行后，事务处理才算成功；若其中有一个语句执行失败，则整个处理就算失败，并恢复到处里前的状态。<br />
　　BeginTrans和CommitTrans用于标记事务的开始和结束，在这两个之间的语句，就是作为事务处理的语句。<br />
</p>
<p>判断事务处理是否成功，可通过连接对象的Error集合来实现，若Error集合的成员个数不为0，则说明有错误发生，事务处理失败。Error集合中的每一个Error对象，代表一个错误信息。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
================<br />
<br />
明：复制表(只复制结构,源表名：a&nbsp;新表名：b)<br />
SQL:&nbsp;select&nbsp;*&nbsp;into&nbsp;b&nbsp;from&nbsp;a&nbsp;where&nbsp;1&lt;&gt;1<br />
<br />
说明：拷贝表(拷贝数据,源表名：a&nbsp;目标表名：b)<br />
SQL:&nbsp;insert&nbsp;into&nbsp;b(a,&nbsp;b,&nbsp;c)&nbsp;select&nbsp;d,e,f&nbsp;from&nbsp;b;<br />
<br />
说明：显示文章、提交人和最后回复时间<br />
SQL:&nbsp;select&nbsp;a.title,a.username,b.adddate&nbsp;from&nbsp;table&nbsp;a,(select&nbsp;max(adddate)&nbsp;adddate&nbsp;from&nbsp;table&nbsp;where&nbsp;table.title=a.title)&nbsp;b<br />
<br />
说明：外连接查询(表名1：a&nbsp;表名2：b)<br />
SQL:&nbsp;select&nbsp;a.a,&nbsp;a.b,&nbsp;a.c,&nbsp;b.c,&nbsp;b.d,&nbsp;b.f&nbsp;from&nbsp;a&nbsp;LEFT&nbsp;OUT&nbsp;JOIN&nbsp;b&nbsp;ON&nbsp;a.a&nbsp;=&nbsp;b.c<br />
<br />
说明：日程安排提前五分钟提醒<br />
SQL:&nbsp;&nbsp;select&nbsp;*&nbsp;from&nbsp;日程安排&nbsp;where&nbsp;datediff('minute',f开始时间,getdate())&gt;5<br />
<br />
<br />
说明：两张关联表，删除主表中已经在副表中没有的信息<br />
SQL:&nbsp;&nbsp;<br />
delete&nbsp;from&nbsp;info&nbsp;where&nbsp;not&nbsp;exists&nbsp;(&nbsp;select&nbsp;*&nbsp;from&nbsp;infobz&nbsp;where&nbsp;info.infid=infobz.infid&nbsp;)&nbsp;<br />
<br />
说明：--<br />
SQL:&nbsp;&nbsp;<br />
SELECT&nbsp;A.NUM,&nbsp;A.NAME,&nbsp;B.UPD_DATE,&nbsp;B.PREV_UPD_DATE<br />
&nbsp;&nbsp;FROM&nbsp;TABLE1,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;X.NUM,&nbsp;X.UPD_DATE,&nbsp;Y.UPD_DATE&nbsp;PREV_UPD_DATE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;(SELECT&nbsp;NUM,&nbsp;UPD_DATE,&nbsp;INBOUND_QTY,&nbsp;STOCK_ONHAND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;TABLE2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;TO_CHAR(UPD_DATE,'YYYY/MM')&nbsp;=&nbsp;TO_CHAR(SYSDATE,&nbsp;'YYYY/MM'))&nbsp;X,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SELECT&nbsp;NUM,&nbsp;UPD_DATE,&nbsp;STOCK_ONHAND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;TABLE2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;TO_CHAR(UPD_DATE,'YYYY/MM')&nbsp;=&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,&nbsp;'YYYY/MM')&nbsp;&amp;brvbar;&amp;brvbar;&nbsp;'/01','YYYY/MM/DD')&nbsp;-&nbsp;1,&nbsp;'YYYY/MM')&nbsp;)&nbsp;Y,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;X.NUM&nbsp;=&nbsp;Y.NUM&nbsp;（+）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;X.INBOUND_QTY&nbsp;+&nbsp;NVL(Y.STOCK_ONHAND,0)&nbsp;&lt;&gt;&nbsp;X.STOCK_ONHAND&nbsp;)&nbsp;B<br />
WHERE&nbsp;A.NUM&nbsp;=&nbsp;B.NUM<br />
<br />
说明：--<br />
SQL:&nbsp;&nbsp;<br />
select&nbsp;*&nbsp;from&nbsp;studentinfo&nbsp;where&nbsp;not&nbsp;exists(select&nbsp;*&nbsp;from&nbsp;student&nbsp;where&nbsp;studentinfo.id=student.id)&nbsp;and&nbsp;系名称='"&amp;strdepartmentname&amp;"'&nbsp;and&nbsp;专业名称='"&amp;strprofessionname&amp;"'&nbsp;order&nbsp;by&nbsp;性别,生源地,高考总成绩<br />
<br />
说明：<br />
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源）<br />
SQL:&nbsp;<br />
SELECT&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;TO_CHAR(a.telfeedate,&nbsp;'yyyy')&nbsp;AS&nbsp;telyear,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'01',&nbsp;a.factration))&nbsp;AS&nbsp;JAN,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'02',&nbsp;a.factration))&nbsp;AS&nbsp;FRI,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'03',&nbsp;a.factration))&nbsp;AS&nbsp;MAR,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'04',&nbsp;a.factration))&nbsp;AS&nbsp;APR,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'05',&nbsp;a.factration))&nbsp;AS&nbsp;MAY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'06',&nbsp;a.factration))&nbsp;AS&nbsp;JUE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'07',&nbsp;a.factration))&nbsp;AS&nbsp;JUL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'08',&nbsp;a.factration))&nbsp;AS&nbsp;AGU,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'09',&nbsp;a.factration))&nbsp;AS&nbsp;SEP,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'10',&nbsp;a.factration))&nbsp;AS&nbsp;OCT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'11',&nbsp;a.factration))&nbsp;AS&nbsp;NOV,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'12',&nbsp;a.factration))&nbsp;AS&nbsp;DEC<br />
FROM&nbsp;(SELECT&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;b.telfeedate,&nbsp;b.factration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;TELFEESTAND&nbsp;a,&nbsp;TELFEE&nbsp;b<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;a.tel&nbsp;=&nbsp;b.telfax)&nbsp;a<br />
GROUP&nbsp;BY&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;TO_CHAR(a.telfeedate,&nbsp;'yyyy')<br />
<br />
说明：四表联查问题：<br />
SQL:&nbsp;select&nbsp;*&nbsp;from&nbsp;a&nbsp;left&nbsp;inner&nbsp;join&nbsp;b&nbsp;on&nbsp;a.a=b.b&nbsp;right&nbsp;inner&nbsp;join&nbsp;c&nbsp;on&nbsp;a.a=c.c&nbsp;&nbsp;inner&nbsp;join&nbsp;d&nbsp;on&nbsp;a.a=d.d&nbsp;where&nbsp;.....<br />
<br />
说明：得到表中最小的未使用的ID号<br />
SQL:<br />
SELECT&nbsp;(CASE&nbsp;WHEN&nbsp;EXISTS(SELECT&nbsp;*&nbsp;FROM&nbsp;Handle&nbsp;b&nbsp;WHERE&nbsp;b.HandleID&nbsp;=&nbsp;1)&nbsp;THEN&nbsp;MIN(HandleID)&nbsp;+&nbsp;1&nbsp;ELSE&nbsp;1&nbsp;END)&nbsp;as&nbsp;HandleID<br />
&nbsp;FROM&nbsp;&nbsp;Handle<br />
&nbsp;WHERE&nbsp;NOT&nbsp;HandleID&nbsp;IN&nbsp;(SELECT&nbsp;a.HandleID&nbsp;-&nbsp;1&nbsp;FROM&nbsp;Handle&nbsp;a)<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/152237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-10-12 09:58 <a href="http://www.blogjava.net/WshmAndLily/articles/152237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL server2005常用的函数和分页的几个解决方案</title><link>http://www.blogjava.net/WshmAndLily/articles/143426.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143426.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143426.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143426.html</trackback:ping><description><![CDATA[<p>SQL server2005常用的函数和分页的几个解决方案：</p>
<p>使用时间和日期的函数<br />
getdate():获取系统当前时间<br />
dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,比如：dateadd(yy,30,getdate())<br />
datediff(datepart,startdate,enddate):计算两个时间的差值,比如：datediff(yy,getdate(),'2008-08-08')<br />
dataname(datepart,date):获取时间不同部分的值，返回值为字符串<br />
datepart(datepart,date):和datename相似，只是返回值为整型<br />
day(date):获取指定时间的天数<br />
month(date):获取指定时间的月份<br />
year(date):获取指定时间的年份</p>
<p>问题1:<br />
表A是一个不断有新记录增加的表，字段t就是记录的插入时间,现在想知道每10秒钟插入到该表的<br />
记录总数大于N条的时间和记录条数，并按由大到小的顺序排序，请写出完成该功能的SQL语句。<br />
解决方案：<br />
declare @t datetime<br />
select @t=min(t) from B<br />
select max(t) as maxT,min(t) as minT,count(*) as Num from B group by <br />
datediff(ss,@t,t)/10 having count(*)&gt;1 order by count(*) desc</p>
<p>全局变量：<br />
以@@开头，且不能由用户自定义，下面来看几个常用的全局变量：<br />
@@rowcount ：表示最近一个语句影响的行数。<br />
@@error:上一条sql语句返回的错误信息。<br />
@@identity:对有标识列的表而言，系统会为表每生成一个新的标识号，这个变量记录的就是最近产生的id。</p>
<p>rowcount:会话级全局变量,比如set rowcount 3 ,就是设置返回的记录数最多是3条，此变量的作用类似于<br />
top子句，TOP 子句适用于指定了该子句的单个 SELECT 语句。SET ROWCOUNT 将一直有效，直到执行另一个 <br />
SET ROWCOUNT 语句，例如 SET ROWCOUNT 0 将关闭该选项。</p>
<p>indetity_insert：会话级全局变量<br />
任何时候，一个会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设<br />
置为 ON，则对另一个表发出 SET IDENTITY_INSERT ON 语句时，SQL Server 2005 将返回一个错误信息，<br />
指出 SET IDENTITY_INSERT 已设置为 ON，并报告已将其属性设置为 ON 的表。<br />
如果插入值大于表的当前标识值，则 SQL Server 自动将新插入值作为当前标识值使用。<br />
SET IDENTITY_INSERT 的设置是在执行或运行时设置的，而不是在分析时设置的。<br />
dbcc checkident (table_name,reseed,n)：此语句的功能是更正列的当前标识值，把table_name的标<br />
识符设置为n。如果当标识列中存在 PRIMARY KEY 或 UNIQUE 约束时，无效标识信息会导致错误消息 2627。</p>
<p>SQL Server的几个分页解决方案：<br />
解决方案1：<br />
declare @pageIndex int,@pageSize int,@recordNum int<br />
set @pageIndex=3<br />
set @pageSize=3<br />
select top(@pageSize) * from Grade where id not in (select top <br />
((@pageIndex-1)*@pageSize) id from Grade)//显示出第 7 到 第 9 条</p>
<p>select @recordNum=count(*) from Grade//显示总记录数</p>
<p>点评：效率不高，而且取出来的数据是按id排序的。如果想按其他字段排序就不行。</p>
<p>解决方案二：<br />
declare @id int<br />
--set rowcount 3<br />
--select @id=id from Grade<br />
select top 3 @id=id from Grade//这句等效于上面注视的两句<br />
select top 3 * form Grade where id&gt;@id//查询出第 4 到第 6 条记录</p>
<p>点评：效率比方案一稍高，但是取出来的数据是也按id排序的。如果想按其他字段排序就不行</p>
<p>解决方案三：<br />
create table #table(new_id int identity(1,1) primary key,id int)<br />
insert into #table(id) select id from grade<br />
select a.* from grade a join #table b&nbsp;&nbsp; on (b.new_id between 6 and 9) and a.id=b.id<br />
//取出第 6 到第 9 条，<br />
点评：其原理是把要分页的表的主键插入到临时表中，临时表的字段就是一个标识列和要分<br />
页的表的主键列（包括是多个主键的情况，上面的两种方法就不行）。特点是效率高，取出<br />
来的数据能根据自己要求的字段排序。</p>
<p>临时表：<br />
上面的解决方案三就是使用了临时表，它与永久表相似，但临时表存储在 tempdb 中，当不<br />
再使用时会自动删除。<br />
临时表有两种类型：本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表<br />
的名称以单个数字符号 (#) 打头；它们仅对当前的用户连接是可见的；当用户从 SQL Server<br />
实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头，创建后对任何用户<br />
都是可见的，当所有引用该表的用户从 SQL Server 断开连接时被删除。</p>
<p>表级变量：<br />
象上面分页的例子也可以使用表级变量，象下面这样：</p>
<p>declare @table table (newid int identiey(1,1),id int)<br />
insert into @table(id) select id from grade<br />
select a.* from grade a join @table b&nbsp;&nbsp; on (b.new_id between 6 and 9) and a.id=b.id<br />
这种方式比使用临时表分页效率更高。</p>
<p>字符串函数：<br />
left(stringExp,intExp):取字符串左边多少个字符<br />
len(strExp):计算指定字符串的长度<br />
char(intExp):根据指定字符的ASCII码返回相应的字符<br />
ascii(strExp)：将一个字符转换成相应的ascii码<br />
lower(strExp):将字符串转换为小写<br />
Upper(strExp):将字符串转换为大写<br />
Ltrim(strExp):去字符串左边的空格<br />
rtrim(strExp):去字符串右边的空格<br />
substring(strExp,intExp,intExp):按指定的索引截取一个字符串的子字符串<br />
replace(strExp,strOldStr,strNewStr):将字符串中的部分内容用新的字符串来代替</p>
<p><br />
系统其他转换函数:<br />
isnull(逻辑表达式,代替值):判断逻辑表达式是否为null，是的话就用指定的值代替。<br />
convert()和cast：<br />
CAST 函数和 CONVERT 函数还可用于获取各种特殊数据格式，并可用于选择列表、WHERE <br />
子句以及允许使用表达式的任何位置中。如果希望 Transact-SQL 程序代码符合 SQL-92，<br />
请使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的功能，请使用 CONVERT <br />
而不要使用 CAST。<br />
使用 CAST 或 CONVERT 时，需要提供以下信息： <br />
要转换的表达式；例如，销售报表要求销售数据从货币数据转换为字符数据。<br />
要将指定的表达式转换为的数据类型，例如 varchar 或其他 SQL Server 系统数据类型。<br />
除非将被转换的值存储起来，否则转换仅在 CAST 函数或 CONVERT 函数的作用时间范围内有效。<br />
如果转换时没有指定数据类型的长度，则 SQL Server 自动将 30 作为长度值。</p>
<p>问题：<br />
有一张商品表，里面三个字段：购买日期，购买人，价格。现在要统计每个购买人每一<br />
季度的消费总价，并算出小计（也就是这一年消费的总价）</p>
<p>解决方案：</p>
<p>创建一张shop表：<br />
create table shop<br />
(<br />
selldate datetime default(getdate()),<br />
name varchar(20),<br />
price money,<br />
)<br />
加入一些测试数据：<br />
insert into shop(selldate,name,price) values('2006-05-12','张三',75)<br />
insert into shop(selldate,name,price) values('2006-07-12','张三',50)<br />
insert into shop(selldate,name,price) values('2006-09-12','张三',43)<br />
insert into shop(selldate,name,price) values('2006-11-12','李四',67)<br />
insert into shop(selldate,name,price) values('2006-01-12','李四',98)<br />
insert into shop(selldate,name,price) values('2006-06-12','李四',100)<br />
insert into shop(selldate,name,price) values('2006-08-12','王五',134)<br />
insert into shop(selldate,name,price) values('2006-04-12','王五',165)<br />
insert into shop(selldate,name,price) values('2006-10-12','王五',85)<br />
insert into shop(selldate,name,price) values('2006-08-12','赵六',11)<br />
insert into shop(selldate,name,price) values('2006-12-12','赵六',165)<br />
insert into shop(selldate,name,price) values('2006-02-12','赵六',17)<br />
insert into shop(selldate,name,price) values('2006-01-12','赵六',198)</p>
<p>select * from shop</p>
<p>解决问题的select语句：<br />
select name 姓名,<br />
sum(case when datepart(q,selldate)=1 then price else 0 end) 第一季度,<br />
sum(case when datepart(q,selldate)=2 then price else 0 end) 第二季度,<br />
sum(case when datepart(q,selldate)=3 then price else 0 end) 第三季度,<br />
sum(case when datepart(q,selldate)=4 then price else 0 end) 第四季度,<br />
sum(price) 小计<br />
from shop&nbsp;&nbsp; group by name </p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:27 <a href="http://www.blogjava.net/WshmAndLily/articles/143426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精妙sql语句</title><link>http://www.blogjava.net/WshmAndLily/articles/143424.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143424.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143424.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143424.html</trackback:ping><description><![CDATA[<div>下列语句部分是<span>Mssql语句，不可以在access中使用。</span></div>
<div></div>
<div>SQL分类： </div>
<div>DDL—数据定义语言<span>(CREATE，ALTER，DROP，DECLARE) </span></div>
<div>DML—数据操纵语言<span>(SELECT，DELETE，UPDATE，INSERT) </span></div>
<div>DCL—数据控制语言<span>(GRANT，REVOKE，COMMIT，ROLLBACK)</span></div>
<div></div>
<div>首先<span>,简要介绍基础语句：</span></div>
<div>1、说明：创建数据库</div>
<div>CREATE DATABASE database-name </div>
<div>2、说明：删除数据库</div>
<div>drop database dbname</div>
<div>3、说明：备份<span>sql server</span></div>
<div>--- 创建 备份数据的<span> device</span></div>
<div>USE master</div>
<div>EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'</div>
<div>--- 开始 备份</div>
<div>BACKUP DATABASE pubs TO testBack </div>
<div>4、说明：创建新表</div>
<div>create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)</div>
<div>根据已有的表创建新表： </div>
<div>A：<span>create table tab_new like tab_old (使用旧表创建新表)</span></div>
<div>B：<span>create table tab_new as select col1,col2&#8230; from tab_old definition only</span></div>
<div>5、说明：删除新表<span>drop table tabname </span></div>
<div>6、说明：增加一个列</div>
<div>Alter table tabname add column col type</div>
<div>注：列增加后将不能删除。<span>DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。</span></div>
<div>7、说明：添加主键：<span> Alter table tabname add primary key(col) </span></div>
<div>说明：删除主键：<span> Alter table tabname drop primary key(col) </span></div>
<div>8、说明：创建索引：<span>create [unique] index idxname on tabname(col&#8230;.) </span></div>
<div>删除索引：<span>drop index idxname</span></div>
<div>注：索引是不可更改的，想更改必须删除重新建。</div>
<div>9、说明：创建视图：<span>create view viewname as select statement </span></div>
<div>删除视图：<span>drop view viewname</span></div>
<div>10、说明：几个简单的基本的<span>sql语句</span></div>
<div>选择：<span>select * from table1 where 范围</span></div>
<div>插入：<span>insert into table1(field1,field2) values(value1,value2)</span></div>
<div>删除：<span>delete from table1 where 范围</span></div>
<div>更新：<span>update table1 set field1=value1 where 范围</span></div>
<div>查找：<span>select * from table1 where field1 like &#8217;%value1%&#8217; ---like的语法很精妙，查资料!</span></div>
<div>排序：<span>select * from table1 order by field1,field2 [desc]</span></div>
<div>总数：<span>select count * as totalcount from table1</span></div>
<div>求和：<span>select sum(field1) as sumvalue from table1</span></div>
<div>平均：<span>select avg(field1) as avgvalue from table1</span></div>
<div>最大：<span>select max(field1) as maxvalue from table1</span></div>
<div>最小：<span>select min(field1) as minvalue from table1</span></div>
<div>11、说明：几个高级查询运算词</div>
<div>A：<span> UNION 运算符 </span></div>
<div>UNION 运算符通过组合其他两个结果表（例如<span> TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 </span></div>
<div>B：<span> EXCEPT 运算符 </span></div>
<div>EXCEPT 运算符通过包括所有在<span> TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 </span></div>
<div>C：<span> INTERSECT 运算符</span></div>
<div>INTERSECT 运算符通过只包括<span> TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 </span></div>
<div>注：使用运算词的几个查询结果行必须是一致的。 </div>
<div>12、说明：使用外连接 </div>
<div>A、<span>left outer join： </span></div>
<div>左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 </div>
<div>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</div>
<div>B：<span>right outer join: </span></div>
<div>右外连接<span>(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。 </span></div>
<div>C：<span>full outer join： </span></div>
<div>全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。</div>
<div></div>
<div>其次，大家来看一些不错的<span>sql语句</span></div>
<div>1、说明：复制表<span>(只复制结构,源表名：a 新表名：b) (Access可用)</span></div>
<div>法一：<span>select * into b from a where 1&lt;&gt;1</span></div>
<div>法二：<span>select top 0 * into b from a</span></div>
<div></div>
<div>2、说明：拷贝表<span>(拷贝数据,源表名：a 目标表名：b) (Access可用)</span></div>
<div>insert into b(a, b, c) select d,e,f from b;</div>
<div></div>
<div>3、说明：跨数据库之间表的拷贝<span>(具体数据使用绝对路径) (Access可用)</span></div>
<div>insert into b(a, b, c) select d,e,f from b in &#8216;具体数据库&#8217;<span> where 条件</span></div>
<div>例子：<span>..from b in '"&amp;Server.MapPath(".")&amp;"\data.mdb" &amp;"' where..</span></div>
<div></div>
<div>4、说明：子查询<span>(表名1：a 表名2：b)</span></div>
<div>select a,b,c from a where a IN (select d from b ) 或者<span>: select a,b,c from a where a IN (1,2,3)</span></div>
<div></div>
<div>5、说明：显示文章、提交人和最后回复时间</div>
<div>select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b</div>
<div></div>
<div>6、说明：外连接查询<span>(表名1：a 表名2：b)</span></div>
<div>select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</div>
<div></div>
<div>7、说明：在线视图查询<span>(表名1：a )</span></div>
<div>select * from (SELECT a,b,c FROM a) T where t.a &gt; 1;</div>
<div></div>
<div>8、说明：<span>between的用法,between限制查询数据范围时包括了边界值,not between不包括</span></div>
<div>select * from table1 where time between time1 and time2</div>
<div>select a,b,c, from table1 where a not between 数值<span>1 and 数值2</span></div>
<div></div>
<div>9、说明：<span>in 的使用方法</span></div>
<div>select * from table1 where a [not] in (&#8216;值<span>1&#8217;,&#8217;值2&#8217;,&#8217;值4&#8217;,&#8217;值6&#8217;)</span></div>
<div></div>
<div>10、说明：两张关联表，删除主表中已经在副表中没有的信息</div>
<div>delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )</div>
<div></div>
<div>11、说明：四表联查问题：</div>
<div>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 .....</div>
<div></div>
<div>12、说明：日程安排提前五分钟提醒</div>
<div>SQL: select * from 日程安排<span> where datediff('minute',f开始时间,getdate())&gt;5</span></div>
<div></div>
<div>13、说明：一条<span>sql 语句搞定数据库分页</span></div>
<div>select top 10 b.* from (select top 20 主键字段<span>,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段</span></div>
<div></div>
<div>14、说明：前<span>10条记录</span></div>
<div>select top 10 * form table1 where 范围</div>
<div></div>
<div>15、说明：选择在每一组<span>b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)</span></div>
<div>select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)</div>
<div></div>
<div>16、说明：包括所有在<span> TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表</span></div>
<div>(select a from tableA ) except (select a from tableB) except (select a from tableC)</div>
<div></div>
<div>17、说明：随机取出<span>10条数据</span></div>
<div>select top 10 * from tablename order by newid()</div>
<div></div>
<div>18、说明：随机选择记录</div>
<div>select newid()</div>
<div></div>
<div>19、说明：删除重复记录</div>
<div>Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)</div>
<div></div>
<div>20、说明：列出数据库里所有的表名</div>
<div>select name from sysobjects where type='U' </div>
<div></div>
<div>21、说明：列出表里的所有的</div>
<div>select name from syscolumns where id=object_id('TableName')</div>
<div></div>
<div>22、说明：列示<span>type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。</span></div>
<div>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</div>
<div>显示结果：</div>
<div>type vender pcs</div>
<div>电脑<span> A 1</span></div>
<div>电脑<span> A 1</span></div>
<div>光盘<span> B 2</span></div>
<div>光盘<span> A 2</span></div>
<div>手机<span> B 3</span></div>
<div>手机<span> C 3</span></div>
<div></div>
<div>23、说明：初始化表<span>table1</span></div>
<div>TRUNCATE TABLE table1</div>
<div></div>
<div>24、说明：选择从<span>10到15的记录</span></div>
<div>select top 5 * from (select top 15 * from table order by id asc) table_别名 <span>order by id desc</span></div>
<div>　　</div>
<div>随机选择数据库记录的方法（使用<span>Randomize函数，通过SQL语句实现）</span></div>
<div>　　对存储在数据库中的数据来说，随机数特性能给出上面的效果，但它们可能太慢了些。你不能要求<span>ASP&#8220;找个随机数&#8221;然后打印出来。实际上常见的解决方案是建立如下所示的循环： </span></div>
<div>Randomize </div>
<div>RNumber = Int(Rnd*499) +1 </div>
<div>　</div>
<div>While Not objRec.EOF </div>
<div>If objRec("ID") = RNumber THEN </div>
<div>... 这里是执行脚本<span> ... </span></div>
<div>end if </div>
<div>objRec.MoveNext </div>
<div>Wend </div>
<div>　</div>
<div>　　这很容易理解。首先，你取出<span>1到500范围之内的一个随机数（假设500就是数据库内记录的总数）。然后，你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495，那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些，但相比更为稳固的企业解决方案这还是个小型数据库了，后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了？ </span></div>
<div>　　采用<span>SQL，你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset，如下所示： </span></div>
<div>Randomize </div>
<div>RNumber = Int(Rnd*499) + 1 </div>
<div>　</div>
<div>SQL = "SELECT * FROM Customers WHERE ID = " &amp; RNumber </div>
<div>　</div>
<div>set objRec = ObjConn.Execute(SQL) </div>
<div>Response.WriteRNumber &amp; " = " &amp; objRec("ID") &amp; " " &amp; objRec("c_email") </div>
<div>　</div>
<div>　　不必写出<span>RNumber 和ID，你只需要检查匹配情况即可。只要你对以上代码的工作满意，你自可按需操作&#8220;随机&#8221;记录。Recordset没有包含其他内容，因此你很快就能找到你需要的记录这样就大大降低了处理时间。 </span></div>
<div>再谈随机数</div>
<div>　　现在你下定决心要榨干<span>Random 函数的最后一滴油，那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。 </span></div>
<div>　　为了取出几条随机选择的记录并存放在同一<span>recordset内，你可以存储三个随机数，然后查询数据库获得匹配这些数字的记录： </span></div>
<div>SQL = "SELECT * FROM Customers WHERE ID = " &amp; RNumber &amp; " OR ID = " &amp; RNumber2 &amp; " OR ID = " &amp; RNumber3 </div>
<div>　</div>
<div>　　假如你想选出<span>10条记录（也许是每次页面装载时的10条链接的列表），你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成，但是 SELECT 语句只显示一种可能（这里的ID 是自动生成的号码）： </span></div>
<div>SQL = "SELECT * FROM Customers WHERE ID BETWEEN " &amp; RNumber &amp; " AND " &amp; RNumber &amp; "+ 9" </div>
<div></div>
<div>　　注意：以上代码的执行目的不是检查数据库内是否有<span>9条并发记录。</span></div>
<div></div>
<div>　</div>
<div>随机读取若干条记录，测试过</div>
<div>Access语法：<span>SELECT top 10 * From 表名 ORDER BY Rnd(id)</span></div>
<div>Sql server:select top n * from 表名<span> order by newid()</span></div>
<div>mysqlelect * From 表名<span> Order By rand() Limit n</span></div>
<div>Access左连接语法<span>(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)</span></div>
<div>语法<span>elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...</span></div>
<div>使用<span>SQL语句 用...代替过长的字符串显示</span></div>
<div>语法：</div>
<div>SQL数据库：<span>select case when len(field)&gt;10 then left(field,10)+'...' else field end as news_name,news_id from tablename</span></div>
<div>Access数据库：<span>SELECT iif(len(field)&gt;2,left(field,2)+'...',field) FROM tablename; </span></div>
<div>　</div>
<div>Conn.Execute说明</div>
<div>Execute方法</div>
<div>　　该方法用于执行<span>SQL语句。根据SQL语句执行后是否返回记录集，该方法的使用格式分为以下两种：</span></div>
<div>　　　　<span>1．执行SQL查询语句时，将返回查询得到的记录集。用法为：</span></div>
<div>　　　　<span>Set 对象变量名=连接对象.Execute("SQL 查询语言")</span></div>
<div>　　　<span>Execute方法调用后，会自动创建记录集对象，并将查询结果存储在该记录对象中，通过Set方法，将记录集赋给指定的对象保存，以后对象变量就代表了该记录集对象。</span></div>
<div></div>
<div>　　　　<span>2．执行SQL的操作性语言时，没有记录集的返回。此时用法为：</span></div>
<div>　　　　连接对象<span>.Execute "SQL 操作性语句" [, RecordAffected][, Option]</span></div>
<div>　　　　　　&#183;<span>RecordAffected 为可选项，此出可放置一个变量，SQL语句执行后，所生效的记录数会自动保存到该变量中。通过访问该变量，就可知道SQL语句队多少条记录进行了操作。</span></div>
<div>　　　　　　&#183;<span>Option 可选项，该参数的取值通常为adCMDText，它用于告诉ADO，应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数，可使执行更高效。</span></div>
<div></div>
<div>&#183;<span>BeginTrans、RollbackTrans、CommitTrans方法</span></div>
<div>　　这三个方法是连接对象提供的用于事务处理的方法。<span>BeginTrans用于开始一个事物；RollbackTrans用于回滚事务；CommitTrans用于提交所有的事务处理结果，即确认事务的处理。</span></div>
<div>　　事务处理可以将一组操作视为一个整体，只有全部语句都成功执行后，事务处理才算成功；若其中有一个语句执行失败，则整个处理就算失败，并恢复到处里前的状态。</div>
<div>　　<span>BeginTrans和CommitTrans用于标记事务的开始和结束，在这两个之间的语句，就是作为事务处理的语句。判断事务处理是否成功，可通过连接对象的Error集合来实现，若Error集合的成员个数不为0，则说明有错误发生，事务处理失败。Error集合中的每一个Error对象，代表一个错误信息。</span></div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:25 <a href="http://www.blogjava.net/WshmAndLily/articles/143424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>collate chinese_prc_ci_as </title><link>http://www.blogjava.net/WshmAndLily/articles/134370.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 04 Aug 2007 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/134370.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/134370.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/134370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/134370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/134370.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>我们在</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">create table</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>时经常会碰到这样的语句，例如：</font></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Verdana">CityName nvarchar(10)collate chinese_prc_ci_as null</span><font face=宋体><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，那它到底是什么意思呢？不妨看看下面：</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>首先，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">collate</span><font face=宋体><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是一个子句，可应用于数据库定义或列定义以定义排序规则，或应用于字符串表达式以应用排序规则投影。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>语法是</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">collate collation_name</span></p>
<p><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">collation_name<collate_name></collate_name><collation_name></collation_name> </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>：：</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">={windows_collation_name}|{sql_collation_name}</span></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>参数</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">collate_name</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是应用于表达式、列定义或数据库定义的排序规则的名称。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">collation_name </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>可以只是指定的</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> Windows_collation_name </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>或</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> SQL_collation_name</span><font face=宋体><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">Windows_collation_name </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> Windows </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则的排序规则名称。参见</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> Windows </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则名称。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br>SQL_collation_name </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> SQL </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则的排序规则名称。参见</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> SQL </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则名称。</font></span><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></p>
<p><span style="FONT-SIZE: 10pt; COLOR: red; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>下面简单介绍一下</font></span><font face=宋体><span style="FONT-SIZE: 10pt; COLOR: red; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">排序规则：</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>什么叫排序规则呢？</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">MS</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是这样描述的：</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">"</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>在</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> Microsoft SQL Server 2000 </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>中，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>字符串的<a href="http://www.itfensi.com/doc/nature" target=_blank><u><font color=#0000ff>物理</font></u></a>存储由排序规则控制。排序规则指定表示每个字符的位模式以及存</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>储和比较字符所使用的规则。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">"<br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　<span style="COLOR: red">在查询分析器内执行下面语句，可以得到</span></font></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Verdana">SQL</span><span style="FONT-SIZE: 9pt; COLOR: red; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Verdana">SERVER</span><font face=宋体><span style="FONT-SIZE: 9pt; COLOR: red; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">支持的所有排序规则。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span style="FONT-SIZE: 9pt; COLOR: red; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Verdana">select * from ::fn_helpcollations() </span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则名称由两部份构成，前半部份是指本排序规则所支持的字符集。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>如：</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">Chinese_PRC_CS_AI_WS <br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>前半部份：指</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">UNICODE</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>字符集，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">Chinese_PRC_</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>指针对大陆简体字</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">UNICODE</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>的排序规则。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>排序规则的后半部份即后缀</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>含义：</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> <br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">_BIN </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>二进制排序</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> <br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">_CI(CS) </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是否区分大小写，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">CI</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>不区分，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">CS</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">_AI(AS) </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是否区分重音，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">AI</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>不区分，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">AS</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分　　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>　　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">_KI(KS) </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是否区分假名类型</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">,KI</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>不区分，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">KS</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分　</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp; _WI(WS) </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>是否区分宽度</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"> WI</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>不区分，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">WS</span><font face=宋体><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">区分　</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"></span></font></p>
<p><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分大小写</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">:</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>如果想让比较将大写字母和小写字母视为不等，请选择该选项。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分重音</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">:</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>如果想让比较将重音和非重音字母视为不等，请选择该选项。如果选择该选项，</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>比较还将重音不同的字母视为不等。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分假名</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">:</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>如果想让比较将片假名和平假名日语音节视为不等，请选择该选项。</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana"><br></span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>区分宽度</font></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Verdana">:</span><span style="FONT-SIZE: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face=宋体>如果想让比较将半角字符和全角字符视为不等，请选择该选项</font></span></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/134370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-04 08:59 <a href="http://www.blogjava.net/WshmAndLily/articles/134370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>