??xml version="1.0" encoding="utf-8" standalone="yes"?>
--在向指定日期加上一D|间的基础上,q回新的 datetime 倹{?br />
DATEDIFF ( datepart , startdate , enddate )
--q回跨两个指定日期的日期和时间边界数?br />
DATENAME ( datepart , date )
--q回代表指定日期的指定日期部分的字符丌Ӏ?br />
DATEPART ( datepart , date )
--q回代表指定日期的指定日期部分的整数?br />
DAY ( date )
--q回代表指定日期的天的日期部分的整数?br />
GETDATE ( )
--?datetime 值的 Microsoft? SQL Server? 标准内部格式q回当前pȝ日期和时间?br />
GETUTCDATE()
--q回表示当前 UTC 旉Q世界时间坐标或格林治标准旉Q的 datetime 倹{?br />
--当前?UTC 旉得自当前的本地时间和q行 SQL Server 的计机操作pȝ中的时区讄?br />
MONTH ( date )
--q回代表指定日期月䆾的整数?br />
YEAR ( date )
--q回表示指定日期中的q䆾的整数?br />
--------------------------------------------------------------------------
/*字符串处理函?/
LCASE( )
LOWER( )
--字W串转换为小写字?
LTRIM( )
--删除字符串前面的I格
SUBSTRING( )
--从字W串中提取一个或多个字符
UCASE( )
UPPER( )
--字W串转换为大写字?
ROUND( )
--数字按指定的小C数四舍五?
FLOOR( )
--数字向下四舍五入ؓ最接近Q最)的整?
CEILING( )
--数字向上四舍五入ؓ最接近的整?
DATALENGTH( )
--q回指定的表辑ּ所用的字节?
--------------------------------------------------------------------------
USER( )
USER_NAME( )
--q回当前用户?
CONVERT( )
--数据从一U类型{换ؓ另一U类型?br />
SOUNDEX( )
--为可创徏"q似"搜烦的指定表辑ּq回 Soundex 代码?br />
STR( )
--数字数据{换ؓ字符Ԍ以便可以用文本运符对其q行处理?
/*全局变量*/
@@CONNECTIONS
--服务器上ơ启动以来创建的q接?br />
@@CPU_BUSY
--?SQL Server 启动至今Q系l持l运行的毫秒数?br />
@@CURSOR_ROWS
--最q打开的游标中的行?br />
@@DATEFIRST
--SET DATEFIRST 参数的当前|该参数用于设|一个星期的W一天ؓ哪一天?br />
@@ERROR
--最后一?T-SQL 错误的错误号
@@FETCH_STATUS
--如果最后一ơ提取的状态ؓ成功状态,则ؓ 0。如果出错,则ؓ -1
@@IDENTITY
--最后一ơ插入的标识?br />
@@LANGUAGE
--当前使用的语a的名U?br />
@@MAX_CONNECTIONS
--可以创徏的同时连接的最大数
@@ROWCOUNT
--受上一?SQL 语句影响的行?br />
@@SERVERNAME
--本地服务器的名称
@@SERVICENAME
--该计机上的 SQL 服务的名U?br />
@@TIMETICKS
--当前计算Z每指令周期的微秒?br />
@@TRANSCOUNT
--当前q接打开的事务数
@@VERSION
--SQL Server 的版本信?br />
-----------------------------------------------------------------------
/*存储q程*/
sp_databases --列出服务器上的所有数据库
sp_server_info --列出服务器信息,如字W集Q版本和排列序
sp_stored_procedures--列出当前环境中的所有存储过E?br />
sp_tables --列出当前环境中所有可以查询的对象
sp_start_job --立即启动自动化Q?br />
sp_stop_job --停止正在执行的自动化d
sp_password --d或修改登录帐L密码
sp_configure --昄(不带选项)或更?带选项)当前服务器的全局配置讄
sp_help --q回表的列名Q数据类型,U束cd{?br />
sp_helptext --昄规则Q默认|未加密的存储q程Q用户定义的函数Q?br />
--触发器或视图的实际文?br />
sp_helpfile --查看当前数据库信?br />
sp_dboption --昄或更Ҏ据库选项
sp_detach_db --分离数据?br />
sp_attach_db --附加数据?br />
sp_addumpdevice --d讑֤
sp_dropdevice --删除讑֤
sp_pkeys --查看主键
sp_fkeys --查看外键
sp_helpdb --查看指定数据库相x件信?br />
sp_addtype --自徏数据cd
sp_droptype --删除自徏数据cd
sp_rename --重新命名数据?br />
sp_executesql --执行SQL语句
sp_addlogin --d登陆
sp_droplogin --删除d
sp_grantdbaccess --把用h到dQ即d一个数据库安全帐户q授予塔讉K权限
sp_revokedbaccess--撤销用户的数据访问权,即从数据库中删除一个安全帐?br />
sp_addrole --d角色
sp_addrolemember --向角色中d成员Q其成为数据库角色的成?br />
sp_addsrvrolemember--修改d使其成ؓ固定服务器角色的成员
sp_grantlogin --允许使用l帐hpȝ用户使用Windowsw䆾验证q接到SQL
sp_defaultdb --修改一个登录的默认数据?br />
sp_helpindex --用于查看表的索引
sp_cursoropen --定义与游标和游标选项相关的SQL语句Q然后生成游?br />
sp_cursorfetch --从游标中提取一行或多行
sp_cursorclose --关闭q放游?br />
sp_cursoroption --讄各种游标选项
sp_cursor --用于h定位更新
sp_cursorprepare --把与游标有关的T-SQL语句或批处理~译成执行计划,但ƈ不创建游?br />
sp_cursorexecute --从由sp_cursorprepare创徏的执行计划中创徏q填充游?br />
sp_cursorunprepare --废弃由sp_cursorprepare生成的执行计?br />
sp_settriggerorder --指定W一个或最后一个激发的、与表关联的 AFTER 触发器。在W一?br />
--和最后一个触发器之间Ȁ发的 AFTER 触发器将按未定义的顺序执?br />
--------------------------------------------------------------------------------
/*服务器角?/
sysadmin
--?SQL Server 中进行Q何活动。该角色的权限跨所有其它固定服务器角色?
serveradmin
--配置服务器范围的讄?
setupadmin
--d和删除链接服务器Qƈ执行某些pȝ存储q程Q如 sp_serveroptionQ?
securityadmin
--理服务器登录?
processadmin
--理?SQL Server 实例中运行的q程?
dbcreator
--创徏和改变数据库?
diskadmin
--理盘文g?
bulkadmin
--执行 BULK INSERT 语句?br />
/*数据库角?/
public
public 角色
--public 角色是一个特D的数据库角Ԍ每个数据库用户都属于它。public 角色Q?
--捕获数据库中用户的所有默认权限?br />
--无法用戗组或角色指z它,因ؓ默认情况下它们即属于该角艌Ӏ?br />
--含在每个数据库中Q包?master、msdb、tempdb、model 和所有用h据库?br />
--无法除去?br />
db_owner
--q行所有数据库角色的活动,以及数据库中的其它维护和配置zd?br />
--该角色的权限跨越所有其它固定数据库角色?br />
db_accessadmin
--在数据库中添加或删除 Windows NT 4.0 ?Windows 2000 l和用户以及 SQL Server 用户?
db_datareader
--查看来自数据库中所有用戯的全部数据?br />
db_datawriter
--d、更Ҏ删除来自数据库中所有用戯的数?br />
db_ddladmin
--d、修Ҏ除去数据库中的对?q行所?DDL)
db_securityadmin
--理 SQL Server 2000 数据库角色的角色和成员,q管理数据库中的语句和对象权?br />
db_backupoperator
--有备份数据库的权?br />
db_denydatareader
--拒绝选择数据库数据的权限
db_denydatawriter
--拒绝更改数据库数据的权限
]]>
--修改数据库属性,讄为只?br />
exec sp_dboption 'Mytest','read only',false--true
go
--讄数据库ؓ自动压羃
exec sp_dboption 'Mytest',autoshrink ,true--false
--收羃数据库的大小
DBCC shrinkdatabase ('Mytest',10)--压~数据库Mytest的大,以userdb中文件有10MB的可用空?br />
go
--分离数据?br />
exec sp_detach_db 'Mytest'
--附加数据?br />
exec sp_attach_db @dbname='Mytest',
@filename1='D:\Mytest\DB_data.mdf',
@filename2='D:\Mytest\DB_data.ldf';
--数据库的备䆾
go
exec sp_addumpdevice 'disk','mydiskdump','d:\Mytest\Mytest.dat'--创徏盘讑֤逻辑?br />
backup database Mytest to mydiskdump
go
--数据库的恢复
restore database 'Mytest'from mydiskdump
go
exec sp_dropdevice 'mydiskdump'
--查看数据?br />
sp_helpdbQsp_helpfilegroup,sp_database;
use Mytest
go
if exists (select *from sysobjects where name='Student')
--if object_id('Student','u')is not null)
drop table Student
create table Student
(
Student_no int identity(1000,1),--自动增长 indentityQseedQincrementQ?seed是基数据Qincrement是增长的速率Q系l自动ؓ该列d数据
Student_name varchar(20)
)
--两种插入数据的方?br />
insert into Student values('wubo')
insert into Student select 'zhang' union select 'lin'
--d主键U束
alter table Student add constraint s_pk primary key (Student_no)
--察看数据库mytest的信?br />
sp_helpdb mytest--或者sp_databases Mytest
select *from Student
--------------------------------------------------------------------
if exists (select *from sysobjects where name='Course')
drop table Course
create table Course
(
Course_no int identity(1000,1),
Course_name varchar(20),
)
--讄服务器的identity关键字可以插入数?br />
set identity_insert course on
set identity_insert course off
insert into Course values( 'c','zhang')
insert into Course select 'java' union select 'c++'
select *From Course
--dU束公式
alter table table_name add constraint constraint_name constraint_type(column_name)
**********
alter table Course add constraint C_pk primary key (Course_no)
--察看U束公式
exec sp_helpconstraint table_name
**********
exec sp_helpconstraint Course
--删除主键U束
alter table Course drop C_pk
--d外键U束
alter table table_name add constraint constraint_name foreign key (column_name) references referenced_table(referenced_table's column_name)
--d列ƈ指定默认gؓNULLQ以前没有该列的数据都设|ؓNULL
alter table Course add Course_teacher varchar(20) default null
--删除?br />
alter table Course drop column Course_teacher
--重命名列
exec sp_rename 'Course.Course_teacher','Course_teacher', 'column'
--重命名表
exec sp_rename 'Course','NewCourse'
--复制表又复制数据,先创然后再复制数?自增和NOT NULL可以复制Q别的约束不能复?br />
select * into temp1 from Course
--只复制表l构
select *into temp from Course where 1>2
--删除表中元素,不能删除被引用的数据Q用以确保引用完整?br />
delete from Course where Course_name='c++'
/****************************************************/
--q两U方法不能被外键引用Q不可带条g删除
--删除表中所有元?写日?br />
delete table Course
--删除表中所有数据,不写日志Q不安全
truncate table Course
/***************************************************/
--模式匚wQ?匚wM字符Ԍ_匚wM一个字W,模式是大写敏感?br />
select *from Course where Course_name like 'c%'--只要W一个ؓc的字母就可以匚w
select *from Course where Course_name like 'c_+'--q个字符串有三个字符Q第二个字符可以使Q意的
select *from Course where Course_no between 1000 and 1002
/***************************************************/
--外键操作
create table dept
(
d_id int primary key,
d_name varchar(20)
)
create table emp
(
e_id int primary key,
e_name varchar(20),
e_no int foreign key references dept(d_id) on update cascade on delete cascade
)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
如果 timestamp 列是外键或被引用键的一部分Q则不能指定 CASCADE?br />
--外健的徏立是在主表徏立外健的列是唯一属性的情况下才能徏?br />
--on delete no action 无q更斎ͼ删除时外键冲H报错ƈ回滚delete
--on update no action 无q更斎ͼ更新时外键冲H报错ƈ回滚update
--on delete cascade 删除时可以联删?br />
--on update cascade 更新时可以联更?br />
--删除数据Ӟ先删除主表的数据Q然后删除从表的数据Q主表是Q被引用的表Q从表是Q引用的?br />
--插入数据Ӟ先插入被引用的表Q然后插入引用的表?br />
/***************************多表查询与聚?***************************/
create table company
(
c_id int primary key,
c_name varchar(20),
c_tel varchar(20)
)
create table dept
(
d_id int primary key,
d_name varchar(20),
d_tel varchar(20),
d_no int foreign key references company(c_id)
)
create table emp
(
e_id int primary key,
e_name varchar(20),
e_tel varchar(20),
e_no int foreign key references dept(d_id)
)
--插入数据
insert into company select 1000,'sun','110'
union select 1001,'ibm','120'
union select 1002,'mir','130'
union select 1003,'top','140'
union select 1004,'mos','150'
insert into dept select 1,'hr','1100',1000
union select 2,'money','1200',1000
union select 3,'kaifa','1300',1000
union select 4,'zuzhi','1400',1000
insert into emp select 100,'wubo','1',1
union select 101,'zhang','2',2
union select 102,'lin','3',3
union select 103,'linbo','4',4
select *from company
select *from dept
select *from emp
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
--左连接运时Q左边的在运后全部存在Q右边的不匹配的用NULL表示
select emp.e_id,emp.e_name from emp left outer join dept on emp.e_no=dept.d_id
--双接运时Q右表的在运后全部存在Q左边的不匹配的用NULL表示
select * from dept right outer join emp on emp.e_no=dept.d_id
--全连?br />
select *from dept full join emp on emp.e_no=dept.d_id
--交叉q接Q笛卡尔U)
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔U。第一个表的行C以第二个表的行数{于W卡积l果集的大小
select e.employeeid, d.name as department from humanresources.employee e cross joinh umanresources.department d order by e.employeeid, d.name
--内连接:仅显CZ的连接表中的匚w行的q接
select * from goods inner join provider on goods.provider_id=provider.provider_id
--联合查询Q?br />
联合查询 union all关键?
(1)两个或更多查询的结果合qؓ单个l果集,该结果集包含联合查询中的所有查询的全部行。UNION q算不同于用联接合q两个表中的列的q算?br />
(2) 下面列出了?UNION 合ƈ两个查询l果集的基本规则Q?
所有查询中的列数和列的序必须相同?br />
数据cd必须兼容?br />
(3) all 参数:全部行q入l果中。其中包括重复行。如果未指定该参敎ͼ则删除重复行
------------------------------------------------------------------
--自引用问?br />
create table employ
(
e_id int primary key,
e_name varchar(23),
e_tel varchar(23),
e_high int foreign key references employ(e_id)
)
insert into employ select 1,'wubo','13484623684',null
union select 2,'zhang','13772436004',1
union select 3,'lin','12345678945',1
union select 4,'bolin','231456789',2
select *From employ
select *from employ e inner join employ m on e.e_id=m.e_high
--创徏数据库: |
/*********** 导入Excel
SELECT *
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,
’Data Source="c:\test.xls";User ID=Admin;PassWord=;Extended properties=Excel 5.0’)...xactions
SELECT cast(cast(U目~号 as numeric(10,2)) as nvarchar(255))+’ ’ 转换后的别名
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,
’Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)...xactions
/** 导入文本文g
EXEC master..xp_cmdshell ’bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword’
/** 导出文本文g
EXEC master..xp_cmdshell ’bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword’
?
EXEC master..xp_cmdshell ’bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword’
导出到TXT文本Q用逗号分开
exec master..xp_cmdshell ’bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password’
BULK INSERT 库名..表名
FROM ’c:\test.txt’
WITH (
FIELDTERMINATOR = ’;’,
ROWTERMINATOR = ’\n’
)
--/* dBase IV文g
select * from
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’
,’dBase IV;HDR=NO;IMEX=2;DATABASE=C:\’,’select * from [客户资料4.dbf]’)
--*/
--/* dBase III文g
select * from
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’
,’dBase III;HDR=NO;IMEX=2;DATABASE=C:\’,’select * from [客户资料3.dbf]’)
--*/
--/* FoxPro 数据?
select * from openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’,
’select * from [aa.DBF]’)
--*/
/**************导入DBF文g****************/
select * from openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:\VFP98\data;
SourceType=DBF’,
’select * from customer where country != "USA" order by country’)
go
/***************** 导出到DBF ***************/
如果要导出数据到已经生成l构(即现存的)FOXPRO表中,可以直接用下面的SQL语句
insert into openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\’,
’select * from [aa.DBF]’)
select * from ?
说明:
SourceDB=c:\ 指定foxpro表所在的文g?
aa.DBF 指定foxpro表的文g?
/*************导出?a title="Access知识技? target="_blank">Access********************/
insert into openrowset(’Microsoft.Jet.OLEDB.4.0’,
/*************导入Access********************/
insert into B?selet * from openrowset(’Microsoft.Jet.OLEDB.4.0’,
’x:\A.mdb’;’admin’;’’,A?
********************* 导入 XML 文g
DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc =’
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
Happy Customer.
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
’
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, ’/root/Customer/Order’, 1)
WITH (oid char(5),
amount float,
comment ntext ’text()’)
EXEC sp_xml_removedocument @idoc
/********************导整个数据库*********************************************/
用bcp实现?a title="存储相关资讯" target="_blank">存储q程
/*
实现数据导入/导出的存储过E?
Ҏ不同的参?可以实现导入/导出整个数据?单个?
调用CZ:
--导出调用CZ
----导出单个?
exec file2table ’zj’,’’,’’,’xzkh_sa..地区资料’,’c:\zj.txt’,1
----导出整个数据?
exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:\docman’,1
--导入调用CZ
----导入单个?
exec file2table ’zj’,’’,’’,’xzkh_sa..地区资料’,’c:\zj.txt’,0
----导入整个数据?
exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:\docman’,0
*/
if exists(select 1 from sysobjects where name=’File2Table’ and objectproperty(id,’IsProcedure’)=1)
drop procedure File2Table
if @tbname like ’%.%.%’ --如果指定了表?则直接导出单个表
begin
set @sql=’bcp ’+@tbname
+case when @isout=1 then ’ out ’ else ’ in ’ end
+’ "’+@filename+’" /w’
+’ /S ’+@servername
+case when isnull(@username,’’)=’’ then ’’ else ’ /U ’+@username end
+’ /P ’+isnull(@password,’’)
exec master..xp_cmdshell @sql
end
else
begin --导出整个数据?定义游标,取出所有的用户?
declare @m_tbname varchar(250)
if right(@filename,1)<>’\’ set @filename=@filename+’\’
set @m_tbname=’declare #tb cursor for select name from ’+@tbname+’..sysobjects where xtype=’’U’’’
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql=’bcp ’+@tbname+’..’+@m_tbname
+case when @isout=1 then ’ out ’ else ’ in ’ end
+’ "’+@filename+@m_tbname+’.txt " /w’
+’ /S ’+@servername
+case when isnull(@username,’’)=’’ then ’’ else ’ /U ’+@username end
+’ /P ’+isnull(@password,’’)
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go
/**********************Excel导到Txt****************************************/
想用
select * into opendatasource(...) from opendatasource(...)
实现一个Excel文g内容导入C个文本文?
假设Excel中有两列Q第一列ؓ姓名Q第二列为很行帐?16?
且银行帐号导出到文本文g后分两部分,?位和?位分开?
如果要用你上面的语句插入的话,文本文g必须存在,而且有一?姓名,银行账号1,银行账号2
然后可以用下面的语句进行插?
注意文g名和目录Ҏ你的实际情况q行?/a>?
insert into
opendatasource(’MICROSOFT.JET.OLEDB.4.0’
,’Text;HDR=Yes;DATABASE=C:\’
)...[aa#txt]
--,aa#txt)
--*/
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
from
opendatasource(’MICROSOFT.JET.OLEDB.4.0’
,’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls’
--,Sheet1$)
)...[Sheet1$]
如果你想直接插入q生成文本文?p用bcp
declare @sql varchar(8000),@tbname varchar(50)
--首先excel表内容导入到一个全局临时?
select @tbname=’[##temp’+cast(newid() as varchar(40))+’]’
,@sql=’select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
into ’+@tbname+’ from
opendatasource(’’MICROSOFT.JET.OLEDB.4.0’’
,’’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls’’
)...[Sheet1$]’
exec(@sql)
--然后用bcp从全局临时表导出到文本文g
set @sql=’bcp "’+@tbname+’" out "c:\aa.txt" /S"(local)" /P"" /c’
exec master..xp_cmdshell @sql
--删除临时?
exec(’drop table ’+@tbname)
用bcp文件导入导出到数据库的存储q程:
/*--bcp-二进制文件的导入导出
支持image,text,ntext字段的导?导出
image适合于二q制文g;text,ntext适合于文本数据文?
注意:导入?覆盖满x件的所有行
导出?把所有满x件的行也出到指定文g?
此存储过E仅用bcp实现
邹徏 2003.08-----------------*/
/*--调用CZ
--数据导出
exec p_binaryIO ’zj’,’’,’’,’acc_演示数据..tb’,’img’,’c:\zj1.dat’
--数据导出
exec p_binaryIO ’zj’,’’,’’,’acc_演示数据..tb’,’img’,’c:\zj1.dat’,’’,0
--*/
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_binaryIO]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[p_binaryIO]
GO
Create proc p_binaryIO
@servename varchar (30),--服务器名U?
@username varchar (30), --用户?
@password varchar (30), --密码
@tbname varchar (500), --数据?.表名
@fdname varchar (30), --字段?
@fname varchar (1000), --目录+文g?处理q程中要使用/覆盖:@filename+.bak
@tj varchar (1000)=’’, --处理条g.对于数据导入,如果条g中包含@fdname,h定表名前~
@isout bit=1 --1导出((默认),0导入
AS
declare @fname_in varchar(1000) --bcp处理应答文g?
,@fsize varchar(20) --要处理的文g的大?
,@m_tbname varchar(50) --临时表名
,@sql varchar(8000)
--则取得导入文件的大小
if @isout=1
set @fsize=’0’
else
begin
create table #tb(可选名 varchar(20),大小 int
,创徏日期 varchar(10),创徏旉 varchar(20)
,上次写操作日?varchar(10),上次写操作时?varchar(20)
,上次讉K日期 varchar(10),上次讉K旉 varchar(20),Ҏ?int)
insert into #tb
exec master..xp_getfiledetails @fname
select @fsize=大小 from #tb
drop table #tb
if @fsize is null
begin
print ’文g未找?#8217;
return
end
end
--生成数据处理应答文g
set @m_tbname=’[##temp’+cast(newid() as varchar(40))+’]’
set @sql=’select * into ’+@m_tbname+’ from(
select null as cd
union all select 0 as 前缀
union all select ’+@fsize+’ as 长度
union all select null as l束
union all select null as 格式
) a’
exec(@sql)
select @fname_in=@fname+’_temp’
,@sql=’bcp "’+@m_tbname+’" out "’+@fname_in
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then ’’
else ’" /U"’+@username end
+’" /P"’+isnull(@password,’’)+’" /c’
exec master..xp_cmdshell @sql
--删除临时?
set @sql=’drop table ’+@m_tbname
exec(@sql)
if @isout=1
begin
set @sql=’bcp "select top 1 ’+@fdname+’ from ’
+@tbname+case isnull(@tj,’’) when ’’ then ’’
else ’ where ’+@tj end
+’" queryout "’+@fname
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then ’’
else ’" /U"’+@username end
+’" /P"’+isnull(@password,’’)
+’" /i"’+@fname_in+’"’
exec master..xp_cmdshell @sql
end
else
begin
--为数据导入准备时表
set @sql=’select top 0 ’+@fdname+’ into ’
+@m_tbname+’ from ’ +@tbname
exec(@sql)
--数据导入到临时?
set @sql=’bcp "’+@m_tbname+’" in "’+@fname
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then ’’
else ’" /U"’+@username end
+’" /P"’+isnull(@password,’’)
+’" /i"’+@fname_in+’"’
exec master..xp_cmdshell @sql
--数据导入到正式表中
set @sql=’update ’+@tbname
+’ set ’+@fdname+’=b.’+@fdname
+’ from ’+@tbname+’ a,’
+@m_tbname+’ b’
+case isnull(@tj,’’) when ’’ then ’’
else ’ where ’+@tj end
exec(@sql)
--删除数据处理临时?
set @sql=’drop table ’+@m_tbname
end
--删除数据处理应答文g
set @sql=’del ’+@fname_in
exec master..xp_cmdshell @sql
go
/** 导入文本文g
EXEC master..xp_cmdshell ’bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword’
改ؓ如下Q不需引号
EXEC master..xp_cmdshell ’bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword’
/** 导出文本文g
EXEC master..xp_cmdshell ’bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword’
此句需加引?/p>
1 SQL Server 2005
SQL Server 2005是微软在推出SQL Server 2000后时隔五q推出的一个数据库q_Q它的数据库引擎为关pd数据和结构化数据提供了更安全可靠?a title="存储相关资讯" target="_blank">存储功能Q用户可以构徏和管理用于业务的高可用和高性能的数据应用程序。此外SQL Server 2005l合了分析、报表、集成和通知功能。这使企业可以构建和部vl济有效的BI解决ҎQ帮助团队通过记分卡、Dashboard、Web Services和移动设备将数据应用推向业务的各个领域。无论是开发h员、数据库理员、信息工作者还是决{者,SQL Server 2005都可以提供出创新的解x案,q可从数据中获得更多的益处?/p>
它所带来的新Ҏ,如T-SQL的增强、数据分区、服?a title="代理相关知识技? target="_blank">代理和与.Net Framework的集成等Q在易管理性、可用性、可伸羃性和安全性等斚w都有很大的增强?/p>
2 表分区的具体实现Ҏ
表分区分为水q_区和垂直分区。水q_区将表分为多个表。每个表包含的列数相同,但是行更。例如,可以一个包含十亿行的表水^分区?12 个表Q每个小表表C特定年份内一个月的数据。Q何需要特定月份数据的查询只需引用相应月䆾的表。而垂直分区则是将原始表分成多个只包含较少列的表。水q_区是最常用分区方式Q本文以水^分区来介l具体实现方法?/p>
水^分区常用的方法是Ҏ时期和用对数据q行水^分区。例如本文例子,一个短信发送记录表包含最q一q的数据Q但是只定期讉K本季度的数据。在q种情况下,可考虑数据分成四个区Q每个区只包含一个季度的数据?/p>
2.1 创徏文gl?/p>
建立分区表先要创建文件组Q而创建多个文件组主要是ؓ了获得好?I/O q。一般情况下Q文件组数最好与分区数相同,q且q些文gl通常位于不同的磁盘上。每个文件组可以׃个或多个文g构成Q而每个分区必L到一个文件组。一个文件组可以由多个分Z用。ؓ了更好地理数据(例如Qؓ了获得更_的备份控?Q对分区表应q行设计Q以便只有相x据或逻辑分组的数据位于同一个文件组中。?ALTER DATABASEQ添加逻辑文gl名Q?/p>
ALTER DATABASE [DeanDB] ADD FILEGROUP [FG1]
DeanDB为数据库名称QFG1文gl名。创建文件组后,再?ALTER DATABASE 文件添加到该文件组中:
ALTER DATABASE [DeanDB] ADD FILE ( NAME = N'FG1', FILENAME = N'C:DeanDataFG1.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ) TO FILEGROUP [FG1]
cM的徏立四个文件和文gl,q把每一个存储数据的文g攑֜不同的磁?a title="驱动下蝲" target="_blank">驱动器里?/p>
2.2 创徏分区函数
创徏分区表必d定分区的功能机Ӟ表进行分区的标准是通过分区函数来决定的。创建数据分区函数有RANGE “LEFT / RIGHT”两种选择。代表每个边界值在局部的哪一辏V例如存在四个分区,则定义三个边界点|q指定每个值是W一个分区的上边?(LEFT) q是W二个分区的下边?(RIGHT)[1]。代码如下:
CREATE PARTITION FUNCTION [SendSMSPF](datetime) AS RANGE RIGHT FOR VALUES ('20070401', '20070701', '20071001')
2.3 创徏分区Ҏ
创徏分区函数后,必须其与分区方案相兌Q以便将分区指向至特定的文gl。就是定义实际存放数据的媒体与各数据块的对应关系。多个数据表可以q相同的数据分区函敎ͼ一般不q相同的数据分区方案。可以通过不同的分区方案,使用相同的分区函敎ͼ使不同的数据表有相同的分区条Ӟ但存攑֜不同的媒介上。创建分区方案的代码如下Q?/p>
CREATE PARTITION SCHEME [SendSMSPS] AS PARTITION [SendSMSPF] TO ([FG1], [FG2], [FG3], [FG4])
2.4 创徏分区?/p>
建立好分区函数和分区Ҏ后,可以创建分了。分是通过定义分区键值和分区Ҏ相联pȝ。插入记录时QSQL SERVER会根据分区键值的不同Q通过分区函数的定义将数据攑ֈ相应的分区。从而把分区函数、分区方案和分区表三者有机的l合h。创建分的代码如下:
CREATE TABLE SendSMSLog
([ID] [int] IDENTITY(1,1) NOT NULL,
[IDNum] [nvarchar](50) NULL,
[SendContent] [text] NULL
[SendDate] [datetime] NOT NULL,
) ON SendSMSPS(SendDate)
2.5 查看分区表信?/p>
pȝq行一D|间或者把以前的数据导入分后,我们需要查看数据的具体存储情况Q即每个分区存取的记录数Q那些记录存取在那个分区{。我们可以通过$partition.SendSMSPF来查看,代码如下Q?/p>
SELECT $partition.SendSMSPF(o.SendDate)
AS [Partition Number]
, min(o.SendDate) AS [Min SendDate]
, max(o.SendDate) AS [Max SendDate]
, count(*) AS [Rows In Partition]
FROM dbo.SendSMSLog AS o
GROUP BY $partition.SendSMSPF(o.SendDate)
ORDER BY [Partition Number]
在查询分析器里执行以上脚本,l果如图1所C:
? 分区表信?/p>
2.6 l护分区
分区的维护主要设计分区的d、减、合q和在分区间转换。可以通过ALTER PARTITION FUNCTION的选项SPLITQMERGE和ALTER TABLE的选项SWITCH来实现。SPLIT会多增加一个分区,而MEGRE会合q或者减分区,SWITCH则是逻辑地在l间转换分区?/p>
3 性能Ҏ
我们?650万数据,存储I间占用U?G的单表进行性能ҎQ测试环境ؓIBM365QCPU 臛_2.7G*2、内?16G、硬?136G*2Q系l^CؓWindows 2003 SP1+SQL Server 2005 SP1。测试结果如?Q?/p>
?Q分区和未分区性能Ҏ?单位Q毫U?
试目 分区 未分?/p>
1 16546 61466
2 13 33
3 20140 61546
4 17140 61000
说明Q?/p>
1Q根据时间检索某一天记录所耗时?/p>
2Q单条记录插入所耗时?/p>
3Q根据时间删除某一天记录所耗时?/p>
4Q统计每月的记录数所需旉
从表1可以看出Q对分区表进行操作比未分区的表要快,q是因ؓ对分的操作采用了CPU和I/O的ƈ行操作,索数据的数据量也变小了,定位数据所耗时间变短?/p>
4 l束?/strong>
Ҏv量数据的处理一直是一个o人头痛的问题。分ȝ技术是所有设计者们首先考虑的问题,不管是分d用程序功能还是分L据访问,如果加以了合理规划,都能十分有效的解军_数据表的q行效率低和l护成本高等问题。SQL Server 2005新增的表分区功能Q可以对数据q行合理分区Q当用户在访问部分数据时QSQL Server最佛_引擎可以Ҏ数据的实体存放,扑և最佳的执行ҎQ而不至于大v捞针?/p>
首先,要介l基语句Q?br />
1、说明:创徏数据?br />
CREATE DATABASE database-name
2、说明:删除数据?br />
drop database dbname
3、说明:备䆾sql server
--- 创徏 备䆾数据?device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开?备䆾
BACKUP DATABASE pubs TO testBack
4、说明:创徏新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
Ҏ已有的表创徏新表Q?
AQcreate table tab_new like tab_old (使用旧表创徏新表)
BQcreate table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后不能删除。DB2中列加上后数据类型也不能改变Q唯一能改变的是增加varcharcd的长度?br />
7、说明:d主键Q?Alter table tabname add primary key(col)
说明Q删除主键: Alter table tabname drop primary key(col)
8、说明:创徏索引Qcreate [unique] index idxname on tabname(col….)
删除索引Qdrop index idxname
注:索引是不可更改的Q想更改必须删除重新建?br />
9、说明:创徏视图Qcreate view viewname as select statement
删除视图Qdrop view viewname
10、说明:几个单的基本的sql语句
选择Qselect * from table1 where 范围
插入Qinsert into table1(field1,field2) values(value1,value2)
删除Qdelete from table1 where 范围
更新Qupdate table1 set field1=value1 where 范围
查找Qselect * from table1 where field1 like ’%value1%’ ---like的语法很_֦Q查资料!
排序Qselect * from table1 order by field1,field2 [desc]
LQselect count * as totalcount from table1
求和Qselect sum(field1) as sumvalue from table1
q_Qselect avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最:select min(field1) as minvalue from table1
11、说明:几个高查询q算?br />
AQ?UNION q算W?
UNION q算W通过l合其他两个l果表(例如 TABLE1 ?TABLE2Qƈ消去表中M重复行而派生出一个结果表。当 ALL ?UNION 一起用时Q即 UNION ALLQ,不消除重复行。两U情况下Q派生表的每一行不是来?TABLE1 是来自 TABLE2?
BQ?EXCEPT q算W?
EXCEPT q算W通过包括所有在 TABLE1 中但不在 TABLE2 中的行ƈ消除所有重复行而派生出一个结果表。当 ALL ?EXCEPT 一起用时 (EXCEPT ALL)Q不消除重复行?
CQ?INTERSECT q算W?br />
INTERSECT q算W通过只包?TABLE1 ?TABLE2 中都有的行ƈ消除所有重复行而派生出一个结果表。当 ALL ?INTERSECT 一起用时 (INTERSECT ALL)Q不消除重复行?
注:使用q算词的几个查询l果行必L一致的?
12、说明:使用外连?
A、left outer joinQ?
左外q接Q左q接Q:l果集几包括q接表的匚w行,也包括左q接表的所有行?
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
BQright outer join:
叛_q接(双?Q结果集既包括连接表的匹配连接行Q也包括双接表的所有行?
CQfull outer joinQ?
全外q接Q不仅包括符可接表的匹配行Q还包括两个q接表中的所有记录?/p>
其次Q大家来看一些不错的sql语句
1、说明:复制?只复制结?源表名:a 新表名:b) (Access可用)
法一Qselect * into b from a where 1<>1
法二Qselect top 0 * into b from a
2、说明:拯?拯数据,源表名:a 目标表名Qb) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拯(具体数据使用l对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据?#8217; where 条g
例子Q?.from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查?表名1Qa 表名2Qb)
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)
5、说明:昄文章、提交h和最后回复时?br /> select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查?表名1Qa 表名2Qb)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1Qa )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用?between限制查询数据范围时包括了边界?not between不包?br />
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数? and 数?
9、说明:in 的用方?br /> select * from table1 where a [not] in (‘?’,’?’,’?’,’?’)
10、说明:两张兌表,删除主表中已l在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题Q?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 .....
12、说明:日程安排提前五分钟提?
SQL: select * from 日程安排 where datediff('minute',f开始时?getdate())>5
13、说明:一条sql 语句搞定数据库分?br /> select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:?0条记?br /> select top 10 * form table1 where 范围
15、说明:选择在每一lb值相同的数据中对应的a最大的记录的所有信?cMq样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成l排?{等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行ƈ消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数?br /> select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段Q以type字段排列Qcase可以方便地实现多重选择Q类似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
昄l果Q?br />
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择?0?5的记?br />
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
随机选择数据库记录的ҎQ用Randomize函数Q通过SQL语句实现Q?br />
?a title="存储相关资讯" target="_blank">存储在数据库中的数据来说Q随机数Ҏ能l出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机?#8221;然后打印出来。实际上常见的解x案是建立如下所C的循环Q?
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... q里是执行脚?...
end if
objRec.MoveNext
Wend
q很Ҏ理解。首先,你取??00范围之内的一个随机数Q假?00是数据库内记录的LQ。然后,你遍历每一记录来测试ID 的倹{检查其是否匚wRNumber。满x件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber {于495Q那么要循环一遍数据库q旉可就长了。虽?00q个数字看v来大了些Q但相比更ؓE_的企业解x案这q是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不死定了Q?
采用SQLQ你可以很快地扑և准确的记录ƈ且打开一个只包含该记录的recordsetQ如下所C:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
不必写出RNumber 和IDQ你只需要检查匹配情况即可。只要你对以上代码的工作满意Q你自可按需操作“随机”记录。Recordset没有包含其他内容Q因此你很快p扑ֈ你需要的记录q样大大降低了处理旉?
再谈随机?
现在你下定决心要榨干Random 函数的最后一滴aQ那么你可能会一ơ取出多条随录或者想采用一定随围内的记录。把上面的标准Random CZ扩展一下就可以用SQL应对上面两种情况了?
Z取出几条随机选择的记录ƈ存放在同一recordset内,你可以存储三个随机数Q然后查询数据库获得匚wq些数字的记录:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想选出10条记录(也许是每ơ页面装载时?0条链接的列表Q,你可以用BETWEEN 或者数学等式选出W一条记录和适当数量的递增记录。这一操作可以通过好几U方式来完成Q但?SELECT 语句只显CZU可能(q里的ID 是自动生成的LQ:
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意Q以上代码的执行目的不是查数据库内是否有9条ƈ发记录?/p>
随机d若干条记录,试q?br />
Access语法QSELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 Order By rand() Limit n
Access左连接语?最q开发要用左q接,Access帮助什么都没有,|上没有Access的SQL说明,只有自己试, 现在C以备后查)
语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL语句 ?..代替q长的字W串昄
语法Q?br />
SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
Conn.Execute说明
ExecuteҎ
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集Q该Ҏ的用格式分Z下两U:
1Q执行SQL查询语句Ӟ返回查询得到的记录集。用法ؓQ?br />
Set 对象变量?q接对象.Execute("SQL 查询语言")
ExecuteҎ调用后,会自动创录集对象Qƈ查询结果存储在该记录对象中Q通过SetҎQ将记录集赋l指定的对象保存Q以后对象变量就代表了该记录集对象?/p>
2Q执行SQL的操作性语aӞ没有记录集的q回。此时用法ؓQ?br />
q接对象.Execute "SQL 操作性语? [, RecordAffected][, Option]
·RecordAffected 为可选项Q此出可攄一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过讉K该变量,可知道SQL语句队多条记录q行了操作?br />
·Option 可选项Q该参数的取值通常为adCMDTextQ它用于告诉ADOQ应该将ExecuteҎ之后的第一个字W解释ؓ命o文本。通过指定该参敎ͼ可执行更高效?/p>
·BeginTrans、RollbackTrans、CommitTransҎ
q三个方法是q接对象提供的用于事务处理的Ҏ。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务QCommitTrans用于提交所有的事务处理l果Q即认事务的处理?br />
事务处理可以一l操作视Z个整体,只有全部语句?a title="成功技? target="_blank">成功执行后,事务处理才算成功Q若其中有一个语句执行失败,则整个处理就失败,q恢复到处里前的状态?br />
BeginTrans和CommitTrans用于标记事务的开始和l束Q在q两个之间的语句Q就是作Z务处理的语句?br />
判断事务处理是否成功Q可通过q接对象的Error集合来实玎ͼ若Error集合的成员个C?Q则说明有错误发生,事务处理p|。Error集合中的每一个Error对象Q代表一个错误信息?br />
================
明:复制?只复制结?源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
说明Q拷贝表(拯数据,源表名:a 目标表名Qb)
SQL: insert into b(a, b, c) select d,e,f from b;
说明Q显C文章、提交h和最后回复时?br />
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明Q外q接查询(表名1Qa 表名2Qb)
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
说明Q日E安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时?getdate())>5
说明Q两张关联表Q删除主表中已经在副表中没有的信?br />
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
说明Q?-
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,
WHERE X.NUM = Y.NUM Q?Q?br />
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM
说明Q?-
SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and pdU?'"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源?高考Ll?br />
说明Q?br />
从数据库中去一q的各单位电话费l计(电话费定额贺电化肥清单两个表来源Q?br />
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
说明Q四表联查问题:
SQL: 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 .....
说明Q得到表中最的未用的ID?br />
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
使用旉和日期的函数
getdate():获取pȝ当前旉
dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新旉?比如Qdateadd(yy,30,getdate())
datediff(datepart,startdate,enddate):计算两个旉的差?比如Qdatediff(yy,getdate(),'2008-08-08')
dataname(datepart,date):获取旉不同部分的|q回gؓ字符?br />
datepart(datepart,date):和datename怼Q只是返回gؓ整型
day(date):获取指定旉的天?br />
month(date):获取指定旉的月?br />
year(date):获取指定旉的年?/p>
问题1:
表A是一个不断有新记录增加的表,字段t是记录的插入时?现在想知道每10U钟插入到该表的
记录L大于N条的旉和记录条敎ͼq按由大到小的顺序排序,请写出完成该功能的SQL语句?br />
解决ҎQ?br />
declare @t datetime
select @t=min(t) from B
select max(t) as maxT,min(t) as minT,count(*) as Num from B group by
datediff(ss,@t,t)/10 having count(*)>1 order by count(*) desc
全局变量Q?br /> 以@@开_且不能由用户自定义,下面来看几个常用的全局变量Q?br /> @@rowcount Q表C最q一个语句媄响的行数?br /> @@error:上一条sql语句q回的错误信息?br /> @@identity:Ҏ标识列的表而言Q系l会每生成一个新的标识号Q这个变量记录的是最q生的id?/p>
rowcount:会话U全局变量,比如set rowcount 3 ,是讄q回的记录数最多是3条,此变量的作用cM?br />
top子句QTOP 子句适用于指定了该子句的单个 SELECT 语句。SET ROWCOUNT 一直有效,直到执行另一?
SET ROWCOUNT 语句Q例?SET ROWCOUNT 0 关闭该选项?/p>
indetity_insertQ会话全局变量
M时候,一个会话中只有一个表?IDENTITY_INSERT 属性可以设|ؓ ON。如果某个表已将此属性设
|ؓ ONQ则对另一个表发出 SET IDENTITY_INSERT ON 语句ӞSQL Server 2005 返回一个错误信息,
指出 SET IDENTITY_INSERT 已设|ؓ ONQƈ报告已将其属性设|ؓ ON 的表?br />
如果插入值大于表的当前标识|?SQL Server 自动新插入g为当前标识g用?br />
SET IDENTITY_INSERT 的设|是在执行或q行时设|的Q而不是在分析时设|的?br />
dbcc checkident (table_name,reseed,n)Q此语句的功能是更正列的当前标识|把table_name的标
识符讄为n。如果当标识列中存在 PRIMARY KEY ?UNIQUE U束Ӟ无效标识信息会导致错误消?2627?/p>
SQL Server的几个分解x案:
解决Ҏ1Q?br />
declare @pageIndex int,@pageSize int,@recordNum int
set @pageIndex=3
set @pageSize=3
select top(@pageSize) * from Grade where id not in (select top
((@pageIndex-1)*@pageSize) id from Grade)//昄出第 7 ?W?9 ?/p>
select @recordNum=count(*) from Grade//昄总记录数
点评Q效率不高,而且取出来的数据是按id排序的。如果想按其他字D|序就不行?/p>
解决Ҏ二:
declare @id int
--set rowcount 3
--select @id=id from Grade
select top 3 @id=id from Grade//q句{效于上面注视的两句
select top 3 * form Grade where id>@id//查询出第 4 到第 6 条记?/p>
点评Q效率比Ҏ一E高Q但是取出来的数据是也按id排序的。如果想按其他字D|序就不行
解决Ҏ三:
create table #table(new_id int identity(1,1) primary key,id int)
insert into #table(id) select id from grade
select a.* from grade a join #table b on (b.new_id between 6 and 9) and a.id=b.id
//取出W?6 到第 9 条,
点评Q其原理是把要分늚表的主键插入C时表中,临时表的字段是一个标识列和要?br />
늚表的主键列(包括是多个主键的情况Q上面的两种Ҏ׃行)。特Ҏ效率高,取出
来的数据能根据自p求的字段排序?/p>
临时表:
上面的解x案三是使用了时表Q它与永久表怼Q但临时表存储在 tempdb 中,当不
再用时会自动删除?br />
临时表有两种cdQ本地和全局。它们在名称、可见性以及可用性上有区别。本C时表
的名UC单个数字W号 (#) 打头Q它们仅对当前的用户q接是可见的Q当用户?SQL Server
实例断开q接时被删除。全局临时表的名称以两个数字符?(##) 打头Q创建后对Q何用?br />
都是可见的,当所有引用该表的用户?SQL Server 断开q接时被删除?/p>
表变量Q?br /> 象上面分늚例子也可以用表U变量,象下面这P
declare @table table (newid int identiey(1,1),id int)
insert into @table(id) select id from grade
select a.* from grade a join @table b on (b.new_id between 6 and 9) and a.id=b.id
q种方式比用时表分页效率更高?/p>
字符串函敎ͼ
left(stringExp,intExp):取字W串左边多少个字W?br />
len(strExp):计算指定字符串的长度
char(intExp):Ҏ指定字符的ASCII码返回相应的字符
ascii(strExp)Q将一个字W{换成相应的ascii?br />
lower(strExp):字W串转换为小?br />
Upper(strExp):字W串转换为大?br />
Ltrim(strExp):dW串左边的空?br />
rtrim(strExp):dW串双的空?br />
substring(strExp,intExp,intExp):按指定的索引截取一个字W串的子字符?br />
replace(strExp,strOldStr,strNewStr):字W串中的部分内容用新的字W串来代?/p>
pȝ其他转换函数:
isnull(逻辑表达?代替?:判断逻辑表达式是否ؓnullQ是的话q指定的gѝ?br />
convert()和castQ?br />
CAST 函数?CONVERT 函数q可用于获取各种Ҏ数据格式Qƈ可用于选择列表、WHERE
子句以及允许使用表达式的M位置中。如果希?Transact-SQL E序代码W合 SQL-92Q?br />
请?CAST 而不要?CONVERT。如果要利用 CONVERT 中的功能Q请使用 CONVERT
而不要?CAST?br />
使用 CAST ?CONVERT Ӟ需要提供以下信息:
要{换的表达式;例如Q销售报表要求销售数据从货币数据转换为字W数据?br />
要将指定的表辑ּ转换为的数据cdQ例?varchar 或其?SQL Server pȝ数据cd?br />
除非被转换的值存储v来,否则转换仅在 CAST 函数?CONVERT 函数的作用时间范围内有效?br />
如果转换时没有指定数据类型的长度Q则 SQL Server 自动?30 作ؓ长度倹{?/p>
问题Q?br />
有一张商品表Q里面三个字D:购买日期Q购ChQh根{现在要l计每个购买人每一
季度的消ҎMhQƈ出计Q也是q一q消费的MhQ?/p>
解决ҎQ?/p>
创徏一张shop表:
create table shop
(
selldate datetime default(getdate()),
name varchar(20),
price money,
)
加入一些测试数据:
insert into shop(selldate,name,price) values('2006-05-12','张三',75)
insert into shop(selldate,name,price) values('2006-07-12','张三',50)
insert into shop(selldate,name,price) values('2006-09-12','张三',43)
insert into shop(selldate,name,price) values('2006-11-12','李四',67)
insert into shop(selldate,name,price) values('2006-01-12','李四',98)
insert into shop(selldate,name,price) values('2006-06-12','李四',100)
insert into shop(selldate,name,price) values('2006-08-12','王五',134)
insert into shop(selldate,name,price) values('2006-04-12','王五',165)
insert into shop(selldate,name,price) values('2006-10-12','王五',85)
insert into shop(selldate,name,price) values('2006-08-12','赵六',11)
insert into shop(selldate,name,price) values('2006-12-12','赵六',165)
insert into shop(selldate,name,price) values('2006-02-12','赵六',17)
insert into shop(selldate,name,price) values('2006-01-12','赵六',198)
select * from shop
解决问题的select语句Q?br />
select name 姓名,
sum(case when datepart(q,selldate)=1 then price else 0 end) W一季度,
sum(case when datepart(q,selldate)=2 then price else 0 end) W二季度,
sum(case when datepart(q,selldate)=3 then price else 0 end) W三季度,
sum(case when datepart(q,selldate)=4 then price else 0 end) W四季度,
sum(price) 计
from shop group by name
首先Q?/font>collate是一个子句,可应用于数据库定义或列定义以定义排序规则Q或应用于字W串表达式以应用排序规则投媄?/span>
语法?/font>collate collation_name
collation_name
参数collate_name是应用于表达式、列定义或数据库定义的排序规则的名称?/font>collation_name 可以只是指定?/font> Windows_collation_name ?/font> SQL_collation_name?/span>
Windows_collation_name ?/font> Windows 排序规则的排序规则名U。参?/font> Windows 排序规则名称?/font>
SQL_collation_name ?/font> SQL 排序规则的排序规则名U。参?/font> SQL 排序规则名称?/font>
下面单介l一?/font>排序规则Q?/span>
什么叫排序规则呢?MS是这hq的Q?/font>"?/font> Microsoft SQL Server 2000 中,
字符串的物理存储由排序规则控制。排序规则指定表C每个字W的位模式以及存
储和比较字符所使用的规则?/font>"
在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则?/span>
select * from ::fn_helpcollations()
排序规则名称׃部䆾构成Q前半部份是指本排序规则所支持的字W集?/font>
如:
Chinese_PRC_CS_AI_WS
前半部䆾Q指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则?/font>
排序规则的后半部份即后缀 含义Q?/font>
_BIN 二进制排?/font>
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音Q?/font>AI不区分,AS区分
_KI(KS) 是否区分假名cd,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
区分大小?/font>:如果惌比较大写字母和写字母视ؓ不等Q请选择该选项?/font>
区分重音:如果惌比较重韛_非重韛_母视Z{,请选择该选项。如果选择该选项Q?/font>
比较q将重音不同的字母视Z{?/font>
区分假名:如果惌比较片假名和^假名日语韌视ؓ不等Q请选择该选项?/font>
区分宽度:如果惌比较半角字W和全角字符视ؓ不等Q请选择该选项