1.清空日志:DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:BACKUP LOG 数据库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小)
--收缩数据库 DBCC SHRINKDATABASE(database_name)
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:
select * from sysfiles DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库.此法将生成新的LOG,大小只有500多K
(用代码:下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离 EXEC sp_detach_db @dbname = \'pubs\'
b.删除日志文件
c.再附加 EXEC sp_attach_single_file_db
@dbname = \'pubs\',
@physname = \'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf\')
5.为了以后能自动收缩,设置:企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
--SQL语句设置方式: EXEC sp_dboption \'数据库名\', \'autoshrink\', \'TRUE\'
6.如果想以后不让它日志增长得太大:企业管理器--服务器--右键数据库--属性--事务日志 --将文 件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式: alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=654569
数据库日志文件的误删或别的原因引起数据库日志的损坏
方法一
1.新建一个同名的数据库
2.再停掉sql server(注意不要分离数据库)
3.用原数据库的数据文件覆盖掉这个新建的数据库
4.再重启sql server
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
数据库的脚本创建一个新的数据库,并将数据导进去就行了.
USE MASTER
GO
SP_CONFIGURE \'ALLOW UPDATES\',1 RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME=\'置疑的数据库名\'
Go
sp_dboption \'置疑的数据库名\', \'single user\', \'true\'
Go
DBCC CHECKDB(\'置疑的数据库名\')
Go
update sysdatabases set status =28 where name=\'置疑的数据库名\'
Go
sp_configure \'allow updates\', 0 reconfigure with override
Go
sp_dboption \'置疑的数据库名\', \'single user\', \'false\'
Go
方法二
事情的起因
昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的?!
这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。真希望这只是一场噩梦!
没有效果的恢复步骤
附加数据库
_Rambo讲过被删除日志文件中不存在活动日志时,可以这么做来恢复:
1,分离被置疑的数据库,可以使用sp_detach_db
2,附加数据库,可以使用sp_attach_single_file_db
但是,很遗憾,执行之后,SQL Server质疑数据文件和日志文件不符,所以无法附加数据库数据文件。
DTS数据导出
不行,无法读取XXX数据库,DTS Wizard报告说“初始化上下文发生错误”。
紧急模式
怡红公子讲过没有日志用于恢复时,可以这么做:
1,把数据库设置为emergency mode
2,重新建立一个log文件
3,把SQL Server 重新启动一下
4,把应用数据库设置成单用户模式
5,做DBCC CHECKDB
6,如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉
我实践了一下,把应用数据库的数据文件移走,重新建立一个同名的数据库XXX,然后停掉SQL服务,把原来的数据文件再覆盖回来。之后,按照怡红公子的步骤走。
但是,也很遗憾,除了第2步之外,其他步骤执行非常成功。可惜,重启SQL Server之后,这个应用数据库仍然是置疑!
不过,让我欣慰的是,这么做之后,倒是能够Select数据了,让我大出一口气。只不过,组件使用数据库时,报告说:“发生错误:-2147467259,未能在数据库 \'XXX\' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。”
最终成功恢复的全部步骤
设置数据库为紧急模式
停掉SQL Server服务;
把应用数据库的数据文件XXX_Data.mdf移走;
重新建立一个同名的数据库XXX;
停掉SQL服务;
把原来的数据文件再覆盖回来;
运行以下语句,把该数据库设置为紧急模式;
运行“Use Master
Go
sp_configure \'allow updates\', 1
reconfigure with override
Go”
执行结果:
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
已将配置选项 \'allow updates\' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。
接着运行“update sysdatabases set status = 32768 where name = \'XXX\'”
执行结果:
(所影响的行数为 1 行)
重启SQL Server服务;
运行以下语句,把应用数据库设置为Single User模式;
运行“sp_dboption \'XXX\', \'single user\', \'true\'”
执行结果:
命令已成功完成。
ü 做DBCC CHECKDB;
运行“DBCC CHECKDB(\'XXX\')”
执行结果:
\'XXX\' 的 DBCC 结果。
\'sysobjects\' 的 DBCC 结果。
对象 \'sysobjects\' 有 273 行,这些行位于 5 页中。
\'sysindexes\' 的 DBCC 结果。
对象 \'sysindexes\' 有 202 行,这些行位于 7 页中。
\'syscolumns\' 的 DBCC 结果。
………
ü 运行以下语句把系统表的修改选项关掉;
运行“sp_resetstatus "XXX"
go
sp_configure \'allow updates\', 0
reconfigure with override
Go”
执行结果:
在 sysdatabases 中更新数据库 \'XXX\' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),
没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
已将配置选项 \'allow updates\' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。
重新建立另外一个数据库XXX.Lost;
DTS导出向导
运行DTS导出向导;
复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;
选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;
所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;
于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;
视图和存储过程是执行SQL语句添加的。
维护Sql Server中表的索引
在使用和创建数据库索引中经常会碰到一些问题,在这里可以采用一些另类的方法解决…
--第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100%
declare @table_id int
set @table_id=object_id(\'表名\')
dbcc showcontig(@table_id)
--第二步:重构表索引
dbcc dbreindex(\'表名\',pk_索引名,100)
--重做第一步,如发现扫描密度/Scan Density还是小于100%则重构表的所有索引
--并不一定能达100%。
dbcc dbreindex(\'表名\',\'\',100)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=654300
SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句。
人工智能自动SQL优化就是使用人工智能技术,自动对SQL语句进行重写,从而找到性能最好的等效SQL语句。
数据库性能的优化
一个数据库系统的生命周期可以分成:设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。
数据库的优化通常可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。
应用程序的优化
应用程序的优化通常可分为两个方面:源代码和SQL语句。由于涉及到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系统性能的提升收效有限。
为什么要优化SQL语句
. SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定性的作用。
. SQL语句消耗了70%至90%的数据库资源。
. SQL语句独立于程序设计逻辑,对SQL语句进行优化不会影响程序逻辑。
. SQL语句有不同的写法,在性能上的差异非常大。
. SQL语句易学,但难精通。
优化SQL语句的传统方法是通过手工重写来对SQL语句进行优化。DBA或资深程序员通过对SQL语句执行计划的分析,依靠经验,尝试重写SQL语句,然后对结果和性能进行比较,以试图找到性能较佳的SQL语句。这种传统上的作法无法找出SQL语句的所有可能写法,且依赖于人的经验,非常耗费时间。
SQL优化技术的发展历程
第一代SQL优化工具是执行计划分析工具。这类工具针对输入的SQL语句,从数据库提取执行计划,并解释执行计划中关键字的含义。
第二代SQL优化工具只能提供增加索引的建议,它通过对输入的SQL语句的执行计划的分析,来产生是否要增加索引的建议。
第三代SQL优化工具不仅分析输入SQL语句的执行计划,还对输入的SQL语句本身进行语法分析,经过分析产生写法上的改进建议。
人工智能自动SQL优化
图1 人工智能自动SQL优化示意图
人工智能自动SQL优化出现在90年代末。目前在商用数据库领域,LECCO Technology Limited(灵高科研有限公司)拥有该技术,并提供使用该技术的自动优化产品LECCO SQL Expert,它支持Oracle、Sybase、MS SQL Server和IBM DB2数据库平台。该产品针对数据库应用的开发和维护阶段提供的模块有:SQL语法优化器、PL/SQL集成化开发调试环境(IDE)、扫描器、数据库监视器等。其核心模块SQL 语法优化器的工作原理为:①输入一条源SQL语句;②“人工智能反馈式搜索引擎”对输入的SQL语句,结合检测到的数据库结构和索引进行重写,产生N条等效的SQL语句输出;③产生的N条等效SQL语句再送入“人工智能反馈式搜索引擎”进行重写,直至无法产生新的输出或搜索限额满;④对输出的SQL语句进行过滤,选出具有不同执行计划的SQL语句;⑤对得到的SQL语句进行批量测试,找出性能最好的SQL语句。
LECCO SQL Expert自动优化实例
假设我们从源代码中抽取出这条SQL语句(也可以通过内带的扫描器或监视器获得SQL语句):
SELECT COUNT(*)
FROM EMPLOYEE
swheresEXISTS (SELECT \'X\'
FROM DEPARTMENT
swheresEMP_DEPT=DPT_ID
AND DPT_NAME LIKE \'AC%\')
AND EMP_ID IN (SELECT SAL_EMP_ID
FROM EMP_SAL_HIST B
swheresSAL_SALARY > 70000)
按下“优化”按钮后,经过10几秒,SQL Expert就完成了优化的过程,并在这10几秒的时间里重写产生了2267 条等价的SQL语句,其中136条SQL语句有不同的执行计划。
接下来,我们可以对自动重写产生的136条SQL语句进行批运行测试,以选出性能最佳的等效SQL语句。按下“批运行” 按钮,在“终止条件” 页选择“最佳运行时间SQL语句”,按“确定”。
经过几分钟的测试运行后,我们可以发现SQL124的运行时间和反应时间最短。运行速度约有22.75倍的提升(源SQL语句运行时间为2.73秒,SQL124运行时间为0.12秒)。现在我们就可以把SQL124放入源代码中,结束一条SQL语句的优化工作了。
“边做边学式训练”提升SQL开发水平
LECCO SQL Expert不仅能够找到最佳的SQL语句,它所提供的“边做边学式训练”还能够教开发人员和数据库管理员如何写出性能最好的SQL语句。LECCO SQL Expert的“SQL比较器”可以标明源SQL和待选SQL间的不同之处。
以上面优化的结果为例,为了查看源SQL语句和SQL124在写法上有什么不同,我们可以按下“比较器” 按钮,对SQL124和源SQL语句进行比较。“SQL 比较器”将SQL124相对于源SQL语句的不同之处以蓝颜色表示了出来。如果选择“双向比较”复选框,“SQL 比较器”可以将两条SQL语句的不同之处以蓝色表示。当然,我们也可以从源语句和重写后的SQL 语句中任选两条进行比较。
从比较的结果可以看到,重写后的SQL124把第一个Exists改写成了In;在字段DPT_ID上进行了合并空字符串的操作,以诱导数据库先执行子查询中的
(SELECT DPT_ID||\'\'
FROM DEPARTMENT
WHERE DPT_NAME LIKE \'AC%\')
在子查询完成后,再与EMPLOYEE表进行嵌套循环连接(Nested Loop Join)。
如果觉得对写法的改变难以理解,还可以点中“执行计划”复选框,通过比较两条SQL语句的执行计划的不同,来了解其中的差异。在查看执行计划过程中,如果有什么不明白的地方,可以点中“SQL信息按钮”,再点击执行计划看不明白的地方,LECCO SQL Expert的上下文敏感帮助系统将提供执行计划该处的解释。
在“SQL比较器”中,选中“统计信息”复选框后,可得到详细的两条SQL语句运行时的统计信息比较,这对于学习不同的SQL写法对数据库资源的消耗很有帮助。
LECCO SQL Expert优化模块的特点
LECCO SQL Expert优化模块的特点主要表现为:自动优化SQL语句;以独家的人工智能知识库“反馈式搜索引擎”来重写性能优异的SQL语句;找出所有等效的SQL语句及可能的执行计划;保证产生相同的结果;先进的SQL语法分析器能处理最复杂的SQL语句;可以重写SELECT、SELECT INTO、UPDATE、INSERT和DELETE语句;通过测试运行,为应用程序和数据库自动找到性能最好的SQL语句;提供微秒级的计时,能够优化Web应用程序和有大量用户的在线事务处理中运行时间很短的SQL语句;为开发人员提供“边做边学式训练”,迅速提高开发人员的SQL编程技能;提供上下文敏感的执行计划帮助系统和SQL运行状态帮助;不是猜测或建议,而是独一无二的SQL重写解决方案。
写出专家级的SQL语句
LECCO SQL Expert的出现,使SQL的优化变得极其简单,只要能够写出SQL语句,它就能帮用户找到最好性能的写法。LECCO SQL Expert不仅能在很短的时间内找到所有可能的优化方案,而且能够通过实际测试,确定最有效的优化方案。同以往的数据库优化手段相比较,LECCO SQL Expert将数据库优化技术带到了一个崭新的技术高度,依赖人的经验、耗费大量时间、受人的思维束缚的数据库优化手段已经被高效、省时且准确的自动优化软件所取代了。通过内建的“LECCO小助手”的帮助,即使是SQL的开发新手,也能快速且简单地写出专家级的SQL语句。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=652551
EmsNo CopGNo ExgVersion
E57705000004 DSHC0741 60
E57705000003 DSHC0741 50
E57705000002 DSHC0741 36
E57705000001 DSHC0742 65
E57705000000 DSHC0742 75
需要的结果:
EmsNo CopGNo ExgVersion
E57705000004 DSHC0741 60
E57705000000 DSHC0742 75
既 CopGNO中每个产品的最大ExgVersion给取出来。
SELECT T.EMSNO,E.COPGNO,E.EXGVERSION ,T.begindate,t.enddate
FROM emsexgversion T ,(SELECT copgno,MAX(ExgVersion) as exgversion from emsexgversion group by copgno) E
WHERE T.COPGNO=E.COPGNO AND T.EXGVERSION=E.EXGVERSION
ORDER BY E.COPGNO
select a.* from emsexgversion a
where not exists(select 1 from emsexgversion where CopGNo=a.CopGNo and ExgVersion>a.ExgVersion)
select 1 from ...
通常存在于exists中.
也可以写做
select 2 from ...
或者任何常数.
因为exists只是判断为不为null来返回true或者false
通常的写法还有
select count(1) from ...
其实等同于
select count(*) from ...
或者
select count(主键) from ...
这样的SQL
根据主键及索引的建立方式,速度上有细小的差别.
而-1 = -1这样的表达式是永远返回true的.
就像 1 = 2是永远返回false一样.
我们通常copy表结构就经常用
create table newtable as
select * from oldtable where 1 = 2;
-1 = -1一般是写在条件不确定的用字符串拼出来的动态SQL中.
比方说:
我的where后面可能有5个条件,也可能一个也没有.
这时我会这样写
".... where 1 = 1"+str1+str2+...; -- 其中的str1,str2等有可能是空字符串.
*******************Transact_SQL********************
--语 句 功 能
--数据操作
SELECT --从数据库表中检索数据行和列
INSERT --向数据库表添加新数据行
DELETE --从数据库表中删除数据行
UPDATE --更新数据库表中的数据
--数据定义
CREATE TABLE --创建一个数据库表
DROP TABLE --从数据库中删除表
ALTER TABLE --修改数据库表结构
CREATE VIEW --创建一个视图
DROP VIEW --从数据库中删除视图
CREATE INDEX --为数据库表创建一个索引
DROP INDEX --从数据库中删除索引
CREATE PROCEDURE --创建一个存储过程
DROP PROCEDURE --从数据库中删除存储过程
CREATE TRIGGER --创建一个触发器
DROP TRIGGER --从数据库中删除触发器
CREATE SCHEMA --向数据库添加一个新模式
DROP SCHEMA --从数据库中删除一个模式
CREATE DOMAIN --创建一个数据值域
ALTER DOMAIN --改变域定义
DROP DOMAIN --从数据库中删除一个域
--数据控制
GRANT --授予用户访问权限
DENY --拒绝用户访问
REVOKE --解除用户访问权限
--事务控制
COMMIT --结束当前事务
ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据访问特征
--程序化SQL
DECLARE --为查询设定游标
EXPLAN --为查询描述数据访问计划
OPEN --检索查询结果打开一个游标
FETCH --检索一行查询结果
CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句
EXECUTE --动态地执行SQL 语句
DESCRIBE --描述准备好的查询
---局部变量
declare @id char(10)
--set @id = \'10010001\'
select @id = \'10010001\'
---全局变量
---必须以@@开头
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print \'x > y\' --打印字符串\'x > y\'
else if @y > @z
print \'y > z\'
else print \'z > y\'
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
***SELECT***
select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = \'str_name\'
stockname like \'% find this %\'
stockname like \'[a-zA-Z]%\' --------- ([]指定值的范围)
stockname like \'[^F-M]%\' --------- (^排除指定范围)
--------- 只能在使用like关键字的where子句中使用通配符)
or stockpath = \'stock_path\'
or stocknumber < 1000
and stockindex = 24
not stocksex = \'man\'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查询
--------- 除非能确保内层select只返回一个行的值,
--------- 否则应在外层where子句中用一个in限定符
select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
select stockname , "stocknumber" = count(*) from table_name group by stockname
--------- group by 将表按行分组,指定列中有相同的值
having count(*) = 2 --------- having选定指定的组
select *
from table1, table2
where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
table1.id =* table2.id -------- 右外部连接
select stockname from table1
union [all] ----- union合并查询结果集,all-保留重复行
select stockname from table2
***insert***
insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
value (select Stockname , Stocknumber from Stock_table2)---value为select语句
***update***
update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
***delete***
delete from table_name where Stockid = 3
truncate table_name ----------- 删除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全删除表
***alter table*** --- 修改数据库表结构
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 显示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 实现删除列的方法(创建新表)
alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
***function()***
----统计函数----
AVG --求平均值
COUNT --统计数目
MAX --求最大值
MIN --求最小值
SUM --求和
--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id
--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
--STDEV()
--STDEV()函数返回表达式中所有数据的标准差
--STDEVP()
--STDEVP()函数返回总体标准差
--VAR()
--VAR()函数返回表达式中所有值的统计变异数
--VARP()
--VARP()函数返回总体变异数
----算术函数----
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
--返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
--把弧度转换为角度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression) --返回表达式的指数值
LOG(float_expression) --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression) --返回<=表达式的最小整数返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression) --返回以integer_expression 为精度的四舍五入值返回的数据
--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression) --返回表达式的绝对值返回的数据类型与表达式相同可为
--INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression) --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
--与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI() --返回值为π 即3.1415926535897936
RAND([integer_expression]) --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
----字符串函数----
ASCII() --函数返回字符表达式最左端字符的ASCII 码值
CHAR() --函数用于将ASCII 码转换为字符
--如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER() --函数把字符串全部转换为小写
UPPER() --函数把字符串全部转换为大写
STR() --函数把数值型数据转换为字符型数据
LTRIM() --函数把字符串头部的空格去掉
RTRIM() --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX() --函数返回一个四位字符码
--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
DIFFERENCE() --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
--0 两个SOUNDEX 函数返回值的第一个字符不同
--1 两个SOUNDEX 函数返回值的第一个字符相同
--2 两个SOUNDEX 函数返回值的第一二个字符相同
--3 两个SOUNDEX 函数返回值的第一二三个字符相同
--4 两个SOUNDEX 函数返回值完全相同
QUOTENAME() --函数返回被特定字符括起来的字符串
REPLICATE() --函数返回一个重复character_expression 指定次数的字符串
REVERSE() --函数将指定的字符串的字符排列顺序颠倒
REPLACE() --函数返回被替换了指定子串的字符串
SPACE() --函数返回一个有指定长度的空白字符串
STUFF() --函数用另一子串替换字符串指定位置长度的子串
----数据类型转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
------------------------------ ------------
199 Jan 15 2000
----日期函数----
DAY() --函数返回date_expression 中的日期值
MONTH() --函数返回date_expression 中的月份值
YEAR() --函数返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函数返回两个指定日期在datepart 方面的不同之处
DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间
----系统函数----
APP_NAME() --函数返回当前执行的应用程序的名称
COALESCE() --函数返回众多表达式中第一个非NULL 表达式的值
COL_LENGTH(<\'table_name\'>, <\'column_name\'>) --函数返回表中指定字段的长度值
COL_NAME(<table_id>, <column_id>) --函数返回表中指定字段的名称即列名
DATALENGTH() --函数返回数据表达式的数据的实际长度
DB_ID([\'database_name\']) --函数返回数据库的编号
DB_NAME(database_id) --函数返回数据库的名称
HOST_ID() --函数返回服务器端计算机的名称
HOST_NAME() --函数返回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
ISDATE() --函数判断所给定的表达式是否为合理日期
ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
ISNUMERIC() --函数判断所给定的表达式是否为合理的数值
NEWID() --函数返回一个UNIQUEIDENTIFIER 类型的数值
NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=642227
Transact SQL 语 句 功 能
========================================================================
--数据操作
SELECT --从数据库表中检索数据行和列
INSERT --向数据库表添加新数据行
DELETE --从数据库表中删除数据行
UPDATE --更新数据库表中的数据
--数据定义
CREATE TABLE --创建一个数据库表
DROP TABLE --从数据库中删除表
ALTER TABLE --修改数据库表结构
CREATE VIEW --创建一个视图
DROP VIEW --从数据库中删除视图
CREATE INDEX --为数据库表创建一个索引
DROP INDEX --从数据库中删除索引
CREATE PROCEDURE --创建一个存储过程
DROP PROCEDURE --从数据库中删除存储过程
CREATE TRIGGER --创建一个触发器
DROP TRIGGER --从数据库中删除触发器
CREATE SCHEMA --向数据库添加一个新模式
DROP SCHEMA --从数据库中删除一个模式
CREATE DOMAIN --创建一个数据值域
ALTER DOMAIN --改变域定义
DROP DOMAIN --从数据库中删除一个域
--数据控制
GRANT --授予用户访问权限
DENY --拒绝用户访问
REVOKE --解除用户访问权限
--事务控制
COMMIT --结束当前事务
ROLLBACK --中止当前事务
SET TRANSACTION --定义当前事务数据访问特征
--程序化SQL
DECLARE --为查询设定游标
EXPLAN --为查询描述数据访问计划
OPEN --检索查询结果打开一个游标
FETCH --检索一行查询结果
CLOSE --关闭游标
PREPARE --为动态执行准备SQL 语句
EXECUTE --动态地执行SQL 语句
DESCRIBE --描述准备好的查询
---局部变量
declare @id char(10)
--set @id = \'10010001\'
select @id = \'10010001\'
---全局变量
---必须以@@开头
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print \'x > y\' --打印字符串\'x > y\'
else if @y > @z
print \'y > z\'
else print \'z > y\'
--CASE
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --打印变量x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --打印变量c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
SELECT
select *(列名) from table_name(表名) where column_name operator value ex宿主)
select * from stock_information where stockid = str(nid)
stockname = \'str_name\'
stockname like \'% find this %\'
stockname like \'[a-zA-Z]%\' --------- ([]指定值的范围)
stockname like \'[^F-M]%\' --------- (^排除指定范围)
--------- 只能在使用like关键字的where子句中使用通配符)
or stockpath = \'stock_path\'
or stocknumber < 1000
and stockindex = 24
not stocksex = \'man\'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列号
stockname = (select stockname from stock_information where stockid = 4)
--------- 子查询
--------- 除非能确保内层select只返回一个行的值
--------- 否则应在外层where子句中用一个in限定符
select distinct column_name form table_name
--------- distinct指定检索独有的列值,不重复
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
select stockname , "stocknumber" = count(*) from table_name group by stockname
--------- group by 将表按行分组,指定列中有相同的值
having count(*) = 2 --------- having选定指定的组
select *
from table1, table2
where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
table1.id =* table2.id -------- 右外部连接
select stockname from table1
union [all] -------- union合并查询结果集,all-保留重复行
select stockname from table2
insert
insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx"
value (select Stockname , Stocknumber from Stock_table2)
-------value为select语句
update
update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
delete
delete from table_name where Stockid = 3
truncate table_name --------- 删除表中所有行,仍保持表的完整性
drop table table_name --------- 完全删除表
alter table -------- 修改数据库表结构
alter table database.owner.table_name add column_name char(2) null ..
sp_help table_name -------- 显示表已有特征
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select -------- 实现删除列的方法(创建新表)
alter table table_name drop constraint Stockname_default
--------- 删除Stockname的default约束
常用函数(function)
转换函数
convert(数据类型,值,格式)
统计函数
AVG --求平均值
COUNT --统计数目
MAX --求最大值
MIN --求最小值
SUM --求和
AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id
MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)
STDEV()
--STDEV()函数返回表达式中所有数据的标准差
--STDEVP()
--STDEVP()函数返回总体标准差
VAR()
--VAR()函数返回表达式中所有值的统计变异数
VARP()
--VARP()函数返回总体变异数
算术函数
三角函数
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
反三角函数
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
------返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
------把弧度转换为角度返回与表达式相同的数据类型可为
------INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression)
------把角度转换为弧度返回与表达式相同的数据类型可为
------INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression) --返回表达式的指数值
LOG(float_expression) --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
取近似值函数
CEILING(numeric_expression)
-------返回>=表达式的最小整数返回的数据类型与表达式相同可为
-------INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression)
-------返回<=表达式的最小整数返回的数据类型与表达式相同可为
-------INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression)
-------返回以integer_expression 为精度的四舍五入值返回的数据
-------类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression)
-------返回表达式的绝对值返回的数据类型与表达式相同可为
-------INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression)
-------测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
-------与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI() -------返回值为π 即3.1415926535897936
RAND([integer_expression])
-------用任选的[integer_expression]做种子值得出0-1 间的随机浮点数
字符串函数
ASCII() ------函数返回字符表达式最左端字符的ASCII 码值
CHAR() ------函数用于将ASCII 码转换为字符
------如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER() ------函数把字符串全部转换为小写
UPPER() ------函数把字符串全部转换为大写
STR() ------函数把数值型数据转换为字符型数据
LTRIM() ------函数把字符串头部的空格去掉
RTRIM() ------函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX() ------函数返回一个四位字符码
------SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
DIFFERENCE() ------函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
------0 两个SOUNDEX 函数返回值的第一个字符不同
------1 两个SOUNDEX 函数返回值的第一个字符相同
------2 两个SOUNDEX 函数返回值的第一二个字符相同
------3 两个SOUNDEX 函数返回值的第一二三个字符相同
------4 两个SOUNDEX 函数返回值完全相同同
QUOTENAME() ------函数返回被特定字符括起来的字符串
REPLICATE() ------函数返回一个重复character_expression 指定次数的字符串
REVERSE() ------函数将指定的字符串的字符排列顺序颠倒
REPLACE() ------函数返回被替换了指定子串的字符串
SPACE() ------函数返回一个有指定长度的空白字符串
STUFF() ------函数用另一子串替换字符串指定位置长度的子串
数据类型转换函数
CAST() 函数语法如下
CAST() ( AS [ length ])
CONVERT() 函数语法如下
CONVERT() ([ length ], [, style])
select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
199 Jan 15 2000
日期函数
DAY() ------函数返回date_expression 中的日期值
MONTH() ------函数返回date_expression 中的月份值
YEAR() ------函数返回date_expression 中的年份值
DATEADD( , ,)
-----函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF( , ,)
-----函数返回两个指定日期在datepart 方面的不同之处
DATENAME( , ------函数以字符串的形式返回日期的指定部分
DATEPART( , ------函数以整数值的形式返回日期的指定部分
GETDATE() ------函数以DATETIME 的缺省格式返回系统当前的日期和时间
系统函数
APP_NAME() ------函数返回当前执行的应用程序的名称
COALESCE() -----函数返回众多表达式中第一个非NULL 表达式的值
COL_LENGTH(<\'table_name\'>, <\'column_name\'> ----函数返回表中指定字段的长度值
COL_NAME(, ----函数返回表中指定字段的名称即列名
DATALENGTH() -----函数返回数据表达式的数据的实际长度
DB_ID([\'database_name\']) ------函数返回数据库的编号
DB_NAME(database_id) ------函数返回数据库的名称
HOST_ID() -----函数返回服务器端计算机的名称
HOST_NAME() -----函数返回服务器端计算机的名称
IDENTITY([, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
ISDATE() ----函数判断所给定的表达式是否为合理日期
ISNULL(, --函数将表达式中的NULL 值用指定值替换
ISNUMERIC() ----函数判断所给定的表达式是否为合理的数值
NEWID() ----函数返回一个UNIQUEIDENTIFIER 类型的数值
NULLIF(,
----NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回xpression1 的值
SQL2000下将数据库直接备份到网络上其他计算机硬盘的方法!
1.两台机器(数据库所在的机器和存放备份文件的机器)都需要建一个同名同密码的用户,方便起见,最好将这两个用户都直接归到管理员组下;
2.将数据库的启动帐户设置成刚才所建立的那个帐户,并重新开启SQL服务;
3.假设远程机器的IP是192.168.61.234,共享为默认共享f$,先用查询分析器登陆到本地的SQL服务器(用sa和信任模式都可以),在master下执行xp_cmdshell \'dir \\192.168.61.234\f$\'看有没有结果,还是有报错的,如有报错,请根据错误提示检查;
4.执行以下备份语句可将数据库备份到远程硬盘上,以crm2k为例:
backup database crm2k to disk=\'\\192.168.61.234\f$\crm2k0722_2.dmp\'
5.同时注意,一定要用“\\机器名或IP”不能用映射的盘符。
不过我觉得直接备份到远程硬盘并不是个好主意,一则速度慢,二则网络传输过程中可能出现意外。还是直接备份到本地,再拷到远程硬盘的好,用SQL的脚本可以调用master..cmdshell \'copy...\'实现。
更正
不好意思,帖中有一处笔识,现更正:
最后:“调用master..cmdshell \'copy...\'实现。”
应该是:“调用master..xp_cmdshell \'copy...\'实现。”
另外,xp_cmdshell是个十分有用的扩展存储过程,可以在SQL中执行WINDOWS的命令行命令,大家有空可以自己研究一下,对我们平时使用SQL过程中,很有帮助的。
本机的备份和还原数据库的Transact-SQL实现
backup database 数据库名称 to disk = \'C:\DATA1\'(具体选择实际的路径名称)
restore database 数据库名称 from disk = \'C:\yuhua.bak\'(具体选择实际的路径名称)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=636935
体现了SQL Server中的四个知识点:
1. 获取SQL Server服务器上的默认目录
2. 备份SQL语句的使用
3. 恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理
4. 作业创建SQL语句的使用
if exists (select * from dbo.sysobjects where id = object_id(N\'[dbo].[f_getdbpath]\') and xtype in (N\'FN\', N\'IF\', N\'TF\'))
drop function [dbo].[f_getdbpath]
GO
create function f_getdbpath(@dbname sysname)
returns nvarchar(260)
as
begin
declare @re nvarchar(260)
if @dbname is null or db_id(@dbname) is null
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=\'master\'
else
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if @dbname is null
set @re=reverse(substring(@re,charindex(\'\\',@re)+5,260))+\'BACKUP\'
else
set @re=reverse(substring(@re,charindex(\'\\',@re),260))
return(@re)
end
go
if exists (select * from dbo.sysobjects where id = object_id(N\'[dbo].[p_backupdb]\') and OBJECTPROPERTY(id, N\'IsProcedure\') = 1)
drop procedure [dbo].[p_backupdb]
GO
create proc p_backupdb
@dbname sysname=\'\', --要备份的数据库名称,不指定则备份当前数据库
@bkpath nvarchar(260)=\'\', --备份文件的存放目录,不指定则使用SQL默认的备份目录
@bkfname nvarchar(260)=\'\', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
@bktype nvarchar(10)=\'DB\', --备份类型:\'DB\'备份数据库,\'DF\' 差异备份,\'LOG\' 日志备份
@appendfile bit=1 --追加/覆盖备份文件
as
declare @sql varchar(8000)
if isnull(@dbname,\'\')=\'\' set @dbname=db_name()
if isnull(@bkpath,\'\')=\'\' set @bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,\'\')=\'\' set @bkfname=\'\DBNAME\_\DATE\_\TIME\.BAK\'
set @bkfname=replace(replace(replace(@bkfname,\'\DBNAME\\',@dbname)
,\'\DATE\\',convert(varchar,getdate(),112))
,\'\TIME\\',replace(convert(varchar,getdate(),108),\':\',\'\'))
set @sql=\'backup \'+case @bktype when \'LOG\' then \'log \' else \'database \' end +@dbname
+\' to disk=\'\'\'+@bkpath+@bkfname
+\'\'\' with \'+case @bktype when \'DF\' then \'DIFFERENTIAL,\' else \'\' end
+case @appendfile when 1 then \'NOINIT\' else \'INIT\' end
print @sql
exec(@sql)
go
if exists (select * from dbo.sysobjects where id = object_id(N\'[dbo].[p_RestoreDb]\') and OBJECTPROPERTY(id, N\'IsProcedure\') = 1)
drop procedure [dbo].[p_RestoreDb]
GO
create proc p_RestoreDb
@bkfile nvarchar(1000), --定义要恢复的备份文件名
@dbname sysname=\'\', --定义恢复后的数据库名,默认为备份的文件名
@dbpath nvarchar(260)=\'\', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retype nvarchar(10)=\'DB\', --恢复类型:\'DB\'完事恢复数据库,\'DBNOR\' 为差异恢复,日志恢复进行完整恢复,\'DF\' 差异备份的恢复,\'LOG\' 日志恢复
@filenumber int=1, --恢复的文件号
@overexist bit=1, --是否覆盖已经存在的数据库,仅@retype为
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
declare @sql varchar(8000)
--得到恢复后的数据库名
if isnull(@dbname,\'\')=\'\'
select @sql=reverse(@bkfile)
,@sql=case when charindex(\'.\',@sql)=0 then @sql
else substring(@sql,charindex(\'.\',@sql)+1,1000) end
,@sql=case when charindex(\'\\',@sql)=0 then @sql
else left(@sql,charindex(\'\\',@sql)-1) end
,@dbname=reverse(@sql)
--得到恢复后的数据库存放目录
if isnull(@dbpath,\'\')=\'\' set @dbpath=dbo.f_getdbpath(\'\')
--生成数据库恢复语句
set @sql=\'restore \'+case @retype when \'LOG\' then \'log \' else \'database \' end+@dbname
+\' from disk=\'\'\'+@bkfile+\'\'\'\'
+\' with file=\'+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in(\'DB\',\'DBNOR\') then \',replace\' else \'\' end
+case @retype when \'DBNOR\' then \',NORECOVERY\' else \',RECOVERY\' end
print @sql
--添加移动逻辑文件的处理
if @retype=\'DB\' or @retype=\'DBNOR\'
begin
--从备份文件中获取逻辑文件名
declare @lfn nvarchar(128),@tp char(1),@i int
--创建临时表,保存获取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
insert into #tb exec(\'restore filelistonly from disk=\'\'\'+@bkfile+\'\'\'\')
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+\',move \'\'\'+@lfn+\'\'\' to \'\'\'+@dbpath+@dbname+cast(@i as varchar)
+case @tp when \'D\' then \'.mdf\'\'\' else \'.ldf\'\'\' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec(\'kill \'+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
--恢复数据库
exec(@sql)
go
if exists (select * from dbo.sysobjects where id = object_id(N\'[dbo].[p_createjob]\') and OBJECTPROPERTY(id, N\'IsProcedure\') = 1)
drop procedure [dbo].[p_createjob]
GO
create proc p_createjob
@jobname varchar(100), --作业名称
@sql varchar(8000), --要执行的命令
@dbname sysname=\'\', --默认为当前的数据库名
@freqtype varchar(6)=\'day\', --时间周期,month 月,week 周,day 日
@fsinterval int=1, --相对于每日的重复次数
@time int=170000 --开始执行时间,对于重复执行的作业,将从0点到23:59分
as
if isnull(@dbname,\'\')=\'\' set @dbname=db_name()
--创建作业
exec msdb..sp_add_job @job_name=@jobname
--创建作业步骤
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = \'数据处理\',
@subsystem = \'TSQL\',
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, --重试次数
@retry_interval = 5 --重试间隔
--创建调度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when \'day\' then 4
when \'week\' then 8
when \'month\' then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval<>1 set @time=0
set @ffactor=case @freqtype when \'day\' then 0 else 1 end
EXEC msdb..sp_add_jobschedule @job_name=@jobname,
@name = \'时间安排\',
@freq_type=@ftype , --每天,8 每周,16 每月
@freq_interval=1, --重复执行次数
@freq_subday_type=@fstype, --是否重复执行
@freq_subday_interval=@fsinterval, --重复周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time --下午17:00:00分执行
go
declare @sql varchar(8000)
--完整备份(每个星期天一次)
set @sql=\'exec p_backupdb @dbname=\'\'要备份的数据库名\'\'\'
exec p_createjob @jobname=\'每周备份\',@sql,@freqtype=\'week\'
--差异备份(每天备份一次)
set @sql=\'exec p_backupdb @dbname=\'\'要备份的数据库名\'\',@bktype=\'DF\'\'
exec p_createjob @jobname=\'每天差异备份\',@sql,@freqtype=\'day\'
--日志备份(每2小时备份一次)
set @sql=\'exec p_backupdb @dbname=\'\'要备份的数据库名\'\',@bktype=\'LOG\'\'
exec p_createjob @jobname=\'每2小时日志备份\',@sql,@freqtype=\'day\',@fsinterval=2
*--应用案例2
生产数据核心库:PRODUCE
备份方案如下:
1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份
2.新建三个新库,分别命名为:每日备份,每周备份,每月备份
3.建立三个作业,分别把三个备份库还原到以上的三个新库。
目的:当用户在produce库中有任何的数据丢失时,均可以从上面的三个备份库中导入相应的TABLE数据。
--*/
declare @sql varchar(8000)
--1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行:
set @sql=\'
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=\'\'PRODUCE_\'\'+convert(varchar(10),getdate(),112)+\'\'_m.bak\'\'
set @path=dbo.f_getdbpath(null)+@fname
--备份
exec p_backupdb @dbname=\'\'PRODUCE\'\',@bkfname=@fname
--根据备份生成每月新库
exec p_RestoreDb @bkfile=@path,@dbname=\'\'PRODUCE_月\'\'
--为周数据库恢复准备基础数据库
exec p_RestoreDb @bkfile=@path,@dbname=\'\'PRODUCE_周\'\',@retype=\'\'DBNOR\'\'
--为日数据库恢复准备基础数据库
exec p_RestoreDb @bkfile=@path,@dbname=\'\'PRODUCE_日\'\',@retype=\'\'DBNOR\'\'
\'
exec p_createjob @jobname=\'每月备份\',@sql,@freqtype=\'month\',@time=164000
--2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行:
set @sql=\'
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=\'\'PRODUCE_\'\'+convert(varchar(10),getdate(),112)+\'\'_w.bak\'\'
set @path=dbo.f_getdbpath(null)+@fname
--差异备份
exec p_backupdb @dbname=\'\'PRODUCE\'\',@bkfname=@fname,@bktype=\'\'DF\'\'
--差异恢复周数据库
exec p_backupdb @bkfile=@path,@dbname=\'\'PRODUCE_周\'\',@retype=\'\'DF\'\'
\'
exec p_createjob @jobname=\'每周差异备份\',@sql,@freqtype=\'week\',@time=170000
--3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行:
set @sql=\'
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=\'\'PRODUCE_\'\'+convert(varchar(10),getdate(),112)+\'\'_l.bak\'\'
set @path=dbo.f_getdbpath(null)+@fname
--日志备份
exec p_backupdb @dbname=\'\'PRODUCE\'\',@bkfname=@fname,@bktype=\'\'LOG\'\'
--日志恢复日数据库
exec p_backupdb @bkfile=@path,@dbname=\'\'PRODUCE_日\'\',@retype=\'\'LOG\'\'
\'
exec p_createjob @jobname=\'每周差异备份\',@sql,@freqtype=\'day\',@time=171500
>>是update 吗
>>又alter 跟update 有何不同呢
update 是否耗时和数据结构的组成有密切关系,最有效率的是那种
每笔纪录都有固定栏数栏宽的资料表结构,那么 update 和 new
的速度差不多,new 是直接摆在资料表最尾端,update 则是算出
该笔纪录在档案的位置,把资料置换过来。
但如果数据结构是那种分隔符式的纯文字资料表,由于他每笔纪录
不一定同栏数,每栏宽度也不固定,也就是每笔纪录的长度不一,你要
换算某笔资料在档案的位置就要麻烦了,况且你要 update 的那笔资料
不见得宽度刚好适合摆得下。
所以每笔纪录固定长度的资料表,update 只需更改一笔纪录,但对
分隔符式资料表而言,update 却必须把整个资料表所有纪录从头到
尾重排一遍。
> ALTER 指的是修改已建立 table 的结构 (schema)
alter 必须重排整个资料表纪录。
> UPDATE 指的是更新 table 中已建立的资料
要补充说的是 delete 和 insert 的动作,delete 在资料表
处理的合理作法上,并不是真把该纪录删去,然后把所有后面的纪录
往前移,因为你不知道该纪录后面是否有成千上万笔纪录要一一前挪的。
它只是把该纪录前面做个删除注记,系统读到他就知道是个已删除的纪录
,而不处理。
至于 insert ,严格说来数据库根本不会做这种插入动作,因为每插
一笔,整个后面纪录就要重挪一遍。如果你的数据库软件可以给你
insert 纪录,那只不过是结合 new 和 resort 之后的障眼法而已。
从这里就可看出,一个资料表经过一段时间的 update,delete,new,
insert 之后,一定排序前后颠到,废纪录注记一堆,效率也愈来愈差,
这时就要整理重建资料表。这没什么大学问,就是先把原资料表 sort
一遍,然后按 sort 过后的次序,一笔笔纪录 copy 到新的资料表,
并丢弃那些有废除注记的纪录,完毕后,再把那新资料 recover 回
来,盖掉旧资料表。
所以什么最花 cpu 时间?当然是资料表纪录重整,其次是纪录排序及搜寻,
最简单的就是只改一笔,并且能用加减乘除的数学运算找出该笔数据得位置。
sysaltfiles 主数据库 保存数据库的文件
syscharsets 主数据库 字符集与排序顺序
sysconfigures 主数据库 配置选项
syscurconfigs 主数据库 当前配置选项
sysdatabases 主数据库 服务器中的数据库
syslanguages 主数据库 语言
syslogins 主数据库 登陆帐号信息
sysoledbusers 主数据库 链接服务器登陆信息
sysprocesses 主数据库 进程
sysremotelogins主数据库 远程登录帐号
syscolumns 每个数据库 列
sysconstrains 每个数据库 限制
sysfilegroups 每个数据库 文件组
sysfiles 每个数据库 文件
sysforeignkeys 每个数据库 外部关键字
sysindexs 每个数据库 索引
sysmenbers 每个数据库 角色成员
sysobjects 每个数据库 所有数据库对象
syspermissions 每个数据库 权限
systypes 每个数据库 用户定义数据类型
sysusers 每个数据库 用户
收藏几段SQL Server语句和存储过程
-- ======================================================
--列出SQL SERVER 所有表,字段名,主键,类型,长度,小数位数等信息
--在查询分析器里运行即可,可以生成一个表,导出到EXCEL中
-- ======================================================
SELECT
(case when a.colorder=1 then d.name else \'\' end)表名,
a.colorder 字段序号,
a.name 字段名,
(case when COLUMNPROPERTY( a.id,a.name,\'IsIdentity\')=1 then \'√\'else \'\' end) 标识,
(case when (SELECT count(*)
FROM sysobjects
WHERE (name in
(SELECT name
FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid
FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid
FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = \'PK\'))>0 then \'√\' else \'\' end) 主键,
b.name 类型,
a.length 占用字节数,
COLUMNPROPERTY(a.id,a.name,\'PRECISION\') as 长度,
isnull(COLUMNPROPERTY(a.id,a.name,\'Scale\'),0) as 小数位数,
(case when a.isnullable=1 then \'√\'else \'\' end) 允许空,
isnull(e.text,\'\') 默认值,
isnull(g.[value],\'\') AS 字段说明
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype=\'U\' and d.name<>\'dtproperties\'
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id=g.id AND a.colid = g.smallid
order by a.id,a.colorder
一、 只复制一个表结构,不复制数据
select top 0 * into [t1] from [t2]
二、 获取数据库中某个对象的创建脚本
1、 先用下面的脚本创建一个函数
if exists(select 1 from sysobjects where id=object_id(\'fgetscript\') and objectproperty(id,\'IsInlineFunction\')=0)
drop function fgetscript
go
create function fgetscript(
@servername varchar(50) --服务器名
,@userid varchar(50)=\'sa\' --用户名,如果为nt验证方式,则为空
,@password varchar(50)=\'\' --密码
,@databasename varchar(50) --数据库名称
,@objectname varchar(250) --对象名
) returns varchar(8000)
as
begin
declare @re varchar(8000) --返回脚本
declare @srvid int,@dbsid int --定义服务器、数据库集id
declare @dbid int,@tbid int --数据库、表id
declare @err int,@src varchar(255), @desc varchar(255) --错误处理变量
--创建sqldmo对象
exec @err=sp_oacreate \'sqldmo.sqlserver\',@srvid output
if @err<>0 goto lberr
--连接服务器
if isnull(@userid,\'\')=\'\' --如果是 Nt验证方式
begin
exec @err=sp_oasetproperty @srvid,\'loginsecure\',1
if @err<>0 goto lberr
exec @err=sp_oamethod @srvid,\'connect\',null,@servername
end
else
exec @err=sp_oamethod @srvid,\'connect\',null,@servername,@userid,@password
if @err<>0 goto lberr
--获取数据库集
exec @err=sp_oagetproperty @srvid,\'databases\',@dbsid output
if @err<>0 goto lberr
--获取要取得脚本的数据库id
exec @err=sp_oamethod @dbsid,\'item\',@dbid output,@databasename
if @err<>0 goto lberr
--获取要取得脚本的对象id
exec @err=sp_oamethod @dbid,\'getobjectbyname\',@tbid output,@objectname
if @err<>0 goto lberr
--取得脚本
exec @err=sp_oamethod @tbid,\'script\',@re output
if @err<>0 goto lberr
--print @re
return(@re)
lberr:
exec sp_oageterrorinfo NULL, @src out, @desc out
declare @errb varbinary(4)
set @errb=cast(@err as varbinary(4))
exec master..xp_varbintohexstr @errb,@re out
set @re=\'错误号: \'+@re
+char(13)+\'错误源: \'+@src
+char(13)+\'错误描述: \'+@desc
return(@re)
end
go
2、 用法如下
用法如下,
print dbo.fgetscript(\'服务器名\',\'用户名\',\'密码\',\'数据库名\',\'表名或其它对象名\')
3、 如果要获取库里所有对象的脚本,如如下方式
declare @name varchar(250)
declare #aa cursor for
select name from sysobjects where xtype not in(\'S\',\'PK\',\'D\',\'X\',\'L\')
open #aa
fetch next from #aa into @name
while @@fetch_status=0
begin
print dbo.fgetscript(\'onlytiancai\',\'sa\',\'sa\',\'database\',@name)
fetch next from #aa into @name
end
close #aa
deallocate #aa
4、 声明,此函数是csdn邹建邹老大提供的
三、 分隔字符串
如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。
1、 获取元素个数的函数
create function getstrarrlength (@str varchar(8000))
returns int
as
begin
declare @int_return int
declare @start int
declare @next int
declare @location int
select @str =\',\'+ @str +\',\'
select @str=replace(@str,\',,\',\',\')
select @start =1
select @next =1
select @location = charindex(\',\',@str,@start)
while (@location <>0)
begin
select @start = @location +1
select @location = charindex(\',\',@str,@start)
select @next =@next +1
end
select @int_return = @next-2
return @int_return
end
2、 获取指定索引的值的函数
create function getstrofindex (@str varchar(8000),@index int =0)
returns varchar(8000)
as
begin
declare @str_return varchar(8000)
declare @start int
declare @next int
declare @location int
select @start =1
select @next =1 --如果习惯从0开始则select @next =0
select @location = charindex(\',\',@str,@start)
while (@location <>0 and @index > @next )
begin
select @start = @location +1
select @location = charindex(\',\',@str,@start)
select @next =@next +1
end
if @location =0 select @location =len(@str)+1 --如果是因为没有逗号退出,则认为逗号在字符串后
select @str_return = substring(@str,@start,@location -@start) --@start肯定是逗号之后的位置或者就是初始值1
if (@index <> @next ) select @str_return = \'\' --如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。
return @str_return
end
3、 测试
SELECT [dbo].[getstrarrlength](\'1,2,3,4,a,b,c,d\')
SELECT [dbo].[getstrofindex](\'1,2,3,4,a,b,c,d\',5)
四、 一条语句执行跨越若干个数据库
我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?
第一种方法:
select * from OPENDATASOURCE(\'SQLOLEDB\',\'Data Source=远程ip;User ID=sa;Password=密码\').库名.dbo.表名
第二种方法:
先使用联结服务器:
EXEC sp_addlinkedserver \'别名\',\'\',\'MSDASQL\',NULL,NULL,\'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;\'
exec sp_addlinkedsrvlogin @rmtsrvname=\'别名\',@useself=\'false\',@locallogin=\'sa\',@rmtuser=\'sa\',@rmtpassword=\'密码\'
GO
然后你就可以如下:
select * from 别名.库名.dbo.表名
insert 库名.dbo.表名 select * from 别名.库名.dbo.表名
select * into 库名.dbo.新表名 from 别名.库名.dbo.表名
go
五、 怎样获取一个表中所有的字段信息
蛙蛙推荐:怎样获取一个表中所有字段的信息
先创建一个视图
Create view fielddesc
as
select o.name as table_name,c.name as field_name,t.name as type,c.length as
length,c.isnullable as isnullable,convert(varchar(30),p.value) as desp
from syscolumns c
join systypes t on c.xtype = t.xusertype
join sysobjects o on o.id=c.id
left join sysproperties p on p.smallid=c.colid and p.id=o.id
where o.xtype=\'U\'
查询时:
Select * from fielddesc where table_name = \'你的表名\'
还有个更强的语句,是邹建写的,也写出来吧
SELECT
(case when a.colorder=1 then d.name else \'\' end) N\'表名\',
a.colorder N\'字段序号\',
a.name N\'字段名\',
(case when COLUMNPROPERTY( a.id,a.name,\'IsIdentity\')=1 then \'√\'else \'\' end) N\'标识\',
(case when (SELECT count(*)
FROM sysobjects
WHERE (name in
(SELECT name
FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid
FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid
FROM syscolumns
WHERE (id = a.id) AND (name = a.name))))))) AND
(xtype = \'PK\'))>0 then \'√\' else \'\' end) N\'主键\',
b.name N\'类型\',
a.length N\'占用字节数\',
COLUMNPROPERTY(a.id,a.name,\'PRECISION\') as N\'长度\',
isnull(COLUMNPROPERTY(a.id,a.name,\'Scale\'),0) as N\'小数位数\',
(case when a.isnullable=1 then \'√\'else \'\' end) N\'允许空\',
isnull(e.text,\'\') N\'默认值\',
isnull(g.[value],\'\') AS N\'字段说明\'
--into ##tx
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype=\'U\' and d.name<>\'dtproperties\'
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id=g.id AND a.colid = g.smallid
order by object_name(a.id),a.colorder
六、 时间格式转换问题
因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。
1、把所有"70.07.06"这样的值变成"1970-07-06"
UPDATE lvshi
SET shengri = \'19\' + REPLACE(shengri, \'.\', \'-\')
WHERE (zhiyezheng = \'139770070153\')
2、在"1970-07-06"里提取"70","07","06"
SELECT SUBSTRING(shengri, 3, 2) AS year, SUBSTRING(shengri, 6, 2) AS month,
SUBSTRING(shengri, 9, 2) AS day
FROM lvshi
WHERE (zhiyezheng = \'139770070153\')
3、把一个时间类型字段转换成"1970-07-06"
UPDATE lvshi
SET shenling = CONVERT(varchar(4), YEAR(shenling))
+ \'-\' + CASE WHEN LEN(MONTH(shenling)) = 1 THEN \'0\' + CONVERT(varchar(2),
month(shenling)) ELSE CONVERT(varchar(2), month(shenling))
END + \'-\' + CASE WHEN LEN(day(shenling)) = 1 THEN \'0\' + CONVERT(char(2),
day(shenling)) ELSE CONVERT(varchar(2), day(shenling)) END
WHERE (zhiyezheng = \'139770070153\')
七、 分区视图
分区视图是提高查询性能的一个很好的办法
--看下面的示例
--示例表
create table tempdb.dbo.t_10(
id int primary key check(id between 1 and 10),name varchar(10))
create table pubs.dbo.t_20(
id int primary key check(id between 11 and 20),name varchar(10))
create table northwind.dbo.t_30(
id int primary key check(id between 21 and 30),name varchar(10))
go
--分区视图
create view v_t
as
select * from tempdb.dbo.t_10
union all
select * from pubs.dbo.t_20
union all
select * from northwind.dbo.t_30
go
--插入数据
insert v_t select 1 ,\'aa\'
union all select 2 ,\'bb\'
union all select 11,\'cc\'
union all select 12,\'dd\'
union all select 21,\'ee\'
union all select 22,\'ff\'
--更新数据
update v_t set name=name+\'_更新\' where right(id,1)=1
--删除测试
delete from v_t where right(id,1)=2
--显示结果
select * from v_t
go
--删除测试
drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
drop view v_t
八、 树型的实现
--参考
--树形数据查询示例
--作者: 邹建
--示例数据
create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
insert [tb] select 0,\'中国\'
union all select 0,\'美国\'
union all select 0,\'加拿大\'
union all select 1,\'北京\'
union all select 1,\'上海\'
union all select 1,\'江苏\'
union all select 6,\'苏州\'
union all select 7,\'常熟\'
union all select 6,\'南京\'
union all select 6,\'无锡\'
union all select 2,\'纽约\'
union all select 2,\'旧金山\'
go
--查询指定id的所有子
create function f_cid(
@id int
)returns @re table([id] int,[level] int)
as
begin
declare @l int
set @l=0
insert @re select @id,@l
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.[id],@l
from [tb] a,@re b
where a.[pid]=b.[id] and b.[level]=@l-1
end
return
end
go
--调用(查询所有的子)
select a.*,层次=b.[level] from [tb] a,f_cid(2)b where a.[id]=b.[id]
go
--删除测试
drop table [tb]
drop function f_cid
go
九、 排序问题
CREATE TABLE [t] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[GUID] [uniqueidentifier] NULL
) ON [PRIMARY]
GO
下面这句执行5次
insert t values (newid())
查看执行结果
select * from t
1、 第一种
select * from t
order by case id when 4 then 1
when 5 then 2
when 1 then 3
when 2 then 4
when 3 then 5 end
2、 第二种
select * from t order by (id+2)%6
3、 第三种
select * from t order by charindex(cast(id as varchar),\'45123\')
4、 第四种
select * from t
WHERE id between 0 and 5
order by charindex(cast(id as varchar),\'45123\')
5、 第五种
select * from t order by case when id >3 then id-5 else id end
6、 第六种
select * from t order by id / 4 desc,id asc
十、 一条语句删除一批记录
首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删
除了,比循环用多条语句高效吧应该。
delete from [fujian] where charindex(\',\'+cast([id] as varchar)+\',\',\',\'+\'5,6,8,9,10,11,\'+\',\')>0
还有一种就是
delete from table1 where id in(1,2,3,4 )
十一、获取子表内的一列数据的组合字符串
下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。
CREATE FUNCTION fn_Get05LvshiNameBySuo (@p_suo Nvarchar(50))
RETURNS Nvarchar(2000)
AS
BEGIN
DECLARE @LvshiNames varchar(2000), @name varchar(50)
select @LvshiNames=\'\'
DECLARE lvshi_cursor CURSOR FOR
数据库里有1,2,3,4,5 共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=628744
--如何在oracle中导入dmp数据库文件?
2006/2/16 zhanghua first create
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。
执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,
DOS中可以执行时由于 在oracle 8i 中 安装目录\ora81\BIN被设置为全局路径,
该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。
oracle用java编写,SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的类文件。
SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类,完成导入导出功能。
下面介绍的是导入导出的实例。
数据导出:
1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
2 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3 将数据库中的表inner_notify、notify_staff_relat导出
exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4 将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like \'00%\'\"
上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。
也可以在上面命令后面 加上 compress=y 来实现。
数据的导入
1 将D:\daochu.dmp 中的数据导入 TEST数据库中。
imp system/manager@TEST file=d:\daochu.dmp
imp aichannel/aichannel@HUST full=y file=file= d:\data\newsmgnt.dmp ignore=y
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上 ignore=y 就可以了。
2 将d:\daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。
注意:
操作者要有足够的权限,权限不够它会提示。
数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。
附录一:
给用户增加导入数据权限的操作
第一,启动sql*puls
第二,以system/manager登陆
第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字
第五, 运行-cmd-进入dmp文件所在的目录,
imp userid=system/manager full=y file=*.dmp
或者 imp userid=system/manager full=y file=filename.dmp
执行示例:
F:\Work\Oracle_Data\backup>imp userid=test/test full=y file=inner_notify.dmp
屏幕显示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.
连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production
经由常规路径导出由EXPORT:V08.01.07创建的文件
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入
导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)
. 正在将AICHANNEL的对象导入到 AICHANNEL
. . 正在导入表 "INNER_NOTIFY" 4行被导入
准备启用约束条件...
成功终止导入,但出现警告。
附录二:
Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.
先建立import9.par,
然后,使用时命令如下:imp parfile=/filepath/import9.par
例 import9.par 内容如下:
FROMUSER=TGPMS
TOUSER=TGPMS2 (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log
1. ASP与Access数据库连接:
<%@ language=VBscript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("数据库名称.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
%>
2. ASP与SQL数据库连接:
<%@ language=VBscript%>
<%
dim conn
set conn=server.createobject("ADODB.connection")
conn.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>
建立记录集对象:
set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,3,2
3. SQL常用命令使用方法:
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in (\'值1\',\'值2\',\'值3\')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
(3) 删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值
COUNT(*¦字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统的计值,其它函数运用同上。
(5) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
4. 记录集对象的方法:
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
---------------------------------------
Recordset对象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。
ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。
CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常数 常数值 说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-------------------------------------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。
-------------------------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可读写 可读写
AbsolutePosition 不支持 不支持 可读写 可读写
ActiveConnection 可读写 可读写 可读写 可读写
BOF 只读 只读 只读 只读
Bookmark 不支持 不支持 可读写 可读写
CacheSize 可读写 可读写 可读写 可读写
CursorLocation 可读写 可读写 可读写 可读写
CursorType 可读写 可读写 可读写 可读写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只读
Filter 可读写 可读写 可读写 可读写
LockType 可读写 可读写 可读写 可读写
MarshalOptions 可读写 可读写 可读写 可读写
MaxRecords 可读写 可读写 可读写 可读写
PageCount 不支持 不支持 只读 只读
PageSize 可读写 可读写 可读写 可读写
RecordCount 不支持 不支持 只读 只读
Source 可读写 可读写 可读写 可读写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。
LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
-------------------------------------------------------------
常数 常数值 说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、
删、改的操作。SQL语句参考及记录集对象详解
1. ASP与Access数据库连接:
<%@ language=VBscript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("数据库名称.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile
%>
2. ASP与SQL数据库连接:
<%@ language=VBscript%>
<%
dim conn
set conn=server.createobject("ADODB.connection") }
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>
建立记录集对象:
set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,3,2
3. SQL常用命令使用方法:
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like \'%字段值%\' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in (\'值1\',\'值2\',\'值3\')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
(3) 删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) values (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值 ;
COUNT(*¦字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统的计值,其它函数运用同上。
(5) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
4. 记录集对象的方法:
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
---------------------------------------
Recordset对象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。
ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。
CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常数 常数值 说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-------------------------------------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。
-------------------------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可读写 可读写
AbsolutePosition 不支持 不支持 可读写 可读写
ActiveConnection 可读写 可读写 可读写 可读写
BOF 只读 只读 只读 只读
Bookmark 不支持 不支持 可读写 可读写
CacheSize 可读写 可读写 可读写 可读写
CursorLocation 可读写 可读写 可读写 可读写
CursorType 可读写 可读写 可读写 可读写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只读
Filter 可读写 可读写 可读写 可读写
LockType 可读写 可读写 可读写 可读写
MarshalOptions 可读写 可读写 可读写 可读写
MaxRecords 可读写 可读写 可读写 可读写
PageCount 不支持 不支持 只读 只读
PageSize 可读写 可读写 可读写 可读写
RecordCount 不支持 不支持 只读 只读
Source 可读写 可读写 可读写 可读写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。
LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
-------------------------------------------------------------
常数 常数值 说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、
删、改的操作。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=480992
RS.OPEN SQL,CONN,A,B
A:
ADOPENFORWARDONLY(=0)
只读,且当前数据记录只能向下移动
ADOPENKEYSET(=1)
只读,当前数据记录可自由移动
ADOPENDYNAMIC(=2)
可读写,当前数据记录可自由移动
ADOPENSTATIC(=3)
可读写,当前数据记录可自由移动,可看到新增记录
B:
ADLOCKREADONLY(=1)
缺省锁定类型,记录集是只读的,不能修改记录
ADLOCKPESSIMISTIC(=2)
悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。
ADLOCKOPTIMISTIC(=3)
乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。
ADLOCKBATCHOPTIMISTIC(=4)
批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。
当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。
对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,
数据在这段时间被更新。这减少了资源的使用。
--1:获取当前数据库中的所有用户表
select Name from sysobjects where xtype=\'u\' and status>=0
--2:获取某一个表的所有字段
select name from syscolumns where id=object_id(\'表名\')
--3:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like \'%表名%\'
--4:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype=\'P\'
--5:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=\'sa\')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
原文链接:http://blog.sina.com.cn/s/blog_6923e2f10100tmtl.html