SQL语句使用大全(转)

Sql代码
  1. -------------------------------------------Review First----------------------------------------   
  2. ------------------数据库、表、索引、视图基本操作----------------------------     
  3. ------------------创建数据库-------------------   
  4. create database Rev_1   
  5. on  
  6. primary  
  7. (   
  8.  name='Rev_1',   
  9.  filename='D:/Rev_1.mdf',   
  10.  size=5MB,   
  11.  maxsize=unlimited,   
  12.  filegrowth=10%   
  13. )   
  14. log on  
  15. (   
  16.  name='Rev_log',   
  17.  filename='D:/Rev_1.l.ldf',   
  18.  size=3mb,   
  19.  maxsize=unlimited,   
  20.  filegrowth=10%   
  21. )--命令已成功完成。   
  22. -----------------查看数据库 -------------------    
  23. sp_helpdb master   
  24. --master       6.50 MB sa 1 04  8 2003  Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=611, Collation=Chinese_PRC_CI_AS, SQLSortOrder=0, IsAutoCreateStatistics, IsAutoUpdateStatistics 90   
  25. -----------------修改数据库-------------------   
  26. --用modify修改数据库时,每次只能修改一个属性   
  27. alter database Rev_1   
  28.    alter database name='Rev_2'--无法用modify命令和以上命令修改数据库名字   
  29. sp_renamedb 'Rev_1','Rev_2' --数据库 名称 'Rev_2' 已设置。   
  30. alter database Rev_1   
  31. modify file   
  32. (   
  33.  name ='Rev_1',   
  34.  size=3Mb--MODIFY FILE 失败。指定的大小小于当前大小。   
  35. )   
  36. alter database Rev_1   
  37. --modify file   
  38. --add file (...)--增加数据文件   
  39. --add log file(...)--增加日志文件   
  40. --remove file file_name --不能删除主数据文件,只能用该命令删除辅助数据文件   
  41. --remove filegroup fg --文件组'fg' 已删除。   
  42. --add filegroup fg filegroup_name   
  43. (   
  44.  name ='Rev_1',   
  45.  size=6Mb   
  46. )--还可以用修改其他属性   
  47. alter database Rev_1   
  48. -------------------删除数据库-------------------   
  49. drop database Rev_1 --无法删除数据库 "Rev_1",因为该数据库当前正在使用。   
  50. -------------------创建表-------------------   
  51. create table Rev_t1   
  52. (   
  53.  rid int primary key identity(1,1) not null,   
  54.  rname varchar(20) null constraint rdft default '张三' ,   
  55.  rage int null constraint rck check (rage>=18 and rage <=100),   
  56.  rphone varchar(30) null  constraint rck_1 check (rphone like '1%')   
  57. )   
  58. -------------------为表增加记录-------------------   
  59. insert into Rev_t1   
  60. (rage,rphone) values(18,'123123')   
  61. -------------------查看表记录-------------------   
  62. select * from Rev_t1   
  63. select rname from Rev_t1   
  64. -------------------删除表记录-------------------   
  65. delete from Rev_t1 where --rid=? --rname=? --rage=?   
  66. -------------------查看表结构-------------------   
  67. sp_help Rev_t1 --查看表属性   
  68. -------------------修改表结构:增加列-------------------   
  69. alter table Rev_t1   
  70.  add --column 注意:增加列时不需要column关键字   
  71.  rdate smalldatetime null constraint dft_rdate default getdate()   
  72. -------------------修改表结构:删除列-------------------   
  73. --删除列的默认值约束   
  74. alter table Rev_t1   
  75.  drop  constraint dft_rdate,rdft   
  76. --删除列的check约束   
  77. alter table Rev_t1   
  78.  drop constraint rck,rck_1   
  79. -------------------修改表结构:修改列-------------------   
  80. alter table Rev_t1   
  81.  alter column    
  82. rname varchar(40) null  
  83. -------------------修改表结构:删除表-------------------   
  84. drop table Rev_t1   
  85.   
  86. ------------------- 索引,视图-------------------   
  87. ----------------索引----------------   
  88. --创建索引--   
  89. create index in_Rev_t1   
  90.  on Rev_t1(rid,rname,rage,rphone,rdate)   
  91. --创建唯一聚集索引--   
  92. create unique clustered index in_Rev_t2   
  93.  on in_Rev_t1(rid,rname)   
  94. --查看索引--   
  95. sp_helpindex in_Rev_t1   
  96. --使用索引--   
  97. select rname from Rev_t1    
  98. with (index(in_Rev_t1)) --注意:使用Index查询时,不是直接查询index,而是从表中查找数据,   
  99.          --用with附带index以及字段。   
  100. --管理索引   
  101. --重命名   
  102. sp_rename 'in_Rev_t1','in_Rev_t2'--不能通过该命令重命名索引   
  103. sp_rename 'Rev_t1.in_Rev_t1','in_Rev_t2','index'--原索引名前必须加表名   
  104. --重建索引   
  105. alter index in_Rev_t1    
  106. on Rev_t1   
  107. rebuild   
  108. --删除索引   
  109. drop index in_Rev_t1    
  110. on  
  111. Rev_t1   
  112.   
  113. ----------------视图----------------   
  114. --创建视图--   
  115. create view vw_Rev_t1   
  116. with encryption,schemabinding --加密,绑定   
  117. as  
  118. select rid,rname,rage,rphone,rdate from dbo.Rev_t1   
  119. --select rid,rname,rage,rphone,rdate from Rev_t1 无法将 视图'vw_Rev_t1' 绑定到架构,因为名称 'Rev_t1' 对于架构绑定无效。名称必须由两部分构成,并且对象不能引用自身。   
  120. --select * from Rev_t1 在绑定到架构的对象中不允许使用语法 '*'。   
  121. --查看视图属性   
  122. sp_help 'vw_Rev_t1'  
  123. sp_helptext 'vw_Rev_t1'  
  124. --修改视图--   
  125. --重命名   
  126. sp_rename 'vw_Rev_t1','vw_Rev_t2' --警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。   
  127. --修改视图属性   
  128. alter view vw_Rev_t1   
  129. as  
  130. select * from dbo.Rev_t1   
  131. --使用视图--   
  132. select * from  vw_Rev_t1 --使用视图查询和使用索引查询是不一样的   
  133. --删除视图--   
  134. drop view vw_Rev_t1   
  135.   
  136. ----------------函数、自定义类型、声明局部变量、多表连接查询----------------   
  137. --T-SQL中提供了4中类型的函数:1.行集函数2.聚合函数3.标量函数4.排名函数   
  138. --------函数--------   
  139. ----聚合函数----   
  140. ----Rollup cube----   
  141. select username from userinfo   
  142.  group by username   
  143.  with rollup  
  144. select userage from userinfo    
  145.  group by userage   
  146.  with cube  
  147. --AVG-SUM--   
  148. --创建xs表,并对其操作--   
  149. create table xs   
  150. (   
  151.  学号 char(6) not null,   
  152.  姓名 char(8) not null,   
  153.  专业名 char (10) not null,   
  154.  性别 bit not null,   
  155.  出生时间 smalldatetime not null,   
  156.  总学分 tinyint not null,   
  157.  备注 text null,   
  158.  入学日期 datetime constraint dateflt default getdate()   
  159. )   
  160. alter table xs   
  161.   modify datetime constraint datedflt default getdate()   
  162. alter table xs  modify  [datetime ] column default getdate()   
  163. alter table xs   
  164.  drop constraint dateflt   
  165. alter table xs   
  166.  add addDate smalldatetime null  
  167.  constraint addDateDflt   
  168.  default getdate() with values  
  169.   
  170. insert into xs   
  171. ( 学号 ,   
  172.  姓名 ,   
  173.  性别 ,   
  174.  总学分 ,   
  175.  备注)values(10,'aa','true',100,'a')   
  176. ------------------创建xs_kc表-------------------    
  177. create table xs_kc   
  178. (   
  179.  学号 char(6) null,   
  180.  姓名 char(8) null,   
  181.  课程 char(10) null  
  182. )   
  183. select * from xs_temp   
  184. select  avg(distinct 总学分) as avgsum=sum(all 总学分) from xs_temp   
  185. --MIN - MAX--   
  186. select max(distinct 总学分) as 无重复最大值,全部最小值=min(all 总学分) from xs_temp   
  187. select * from xs   
  188. select 平均分=avg(总学分),总分=sum(总学分)   
  189.  from xs   
  190. select min=min(distinct 总学分),max = max(distinct 总学分)   
  191.  from xs   
  192. update  xs   
  193.  set 总学分=100   
  194.  where 姓名='wer' or 姓名='sadf'  
  195. --COUNT--   
  196. select 所有列和=count(all *),无重复列和=count(distinct *) from xs_temp--'*' 附近有语法错误。   
  197. select 所有列和=count(all),无重复列和=count(distinctfrom xs_temp--')' 附近有语法错误。   
  198. select 所有列和=count(all 总学分),无重复列和=count(distinct 总学分) from xs_temp   
  199. ----字符串函数----   
  200. select str(123.456,10,5)--123.45600   
  201. select str(123.456,3,0)--123   
  202. select str(123.456,3,2) --123 --中间的参数控制总长度,第三个参数控制小数位数   
  203. --LEFT-RIGHT--   
  204. select left('123456',5)--12345   
  205. select right('123456',5)--23456   
  206. select left('just do it',6)   
  207. select right ('live now',5)   
  208. --LEN--   
  209. select len('123456')   
  210. select len ('just do it and live now')   
  211. select len(select 姓名 from xs_temp where 姓名='sadf')--提示语法错误   
  212. --REVERSE--   
  213. select reverse('123456')--654321   
  214. select reverse ('just do it and live now')   
  215. --LOWER - UPPER--   
  216. select lower('LOWER')   
  217. select upper('upper')   
  218. select lower('JUST')   
  219. select upper('just')   
  220. --LTRIM RTRIM--   
  221. select ltrim('   ab   cde   ')    
  222. select rtrim('   ab   cde   ')    
  223. select ltrim('just  ')   
  224. select rtrim('   just ')   
  225.  --SQL中没有trim内置函数,也就是没有直接去掉所有空格的函数   
  226. --substring--   
  227. select substring('just do it ',4,3)   
  228. --charindex--   
  229. select charindex=charindex('i','just do it'--as 'charindex'   
  230. --nchar--   
  231. select nchar('43')   
  232. --ascii--   
  233. select ascii('4')   
  234. --replace--   
  235. select replace('just_do_it_and_ ',' ','live_now')   
  236. ----数学函数----   
  237. --ABS--   
  238. select abs(-123456)--取绝对值   
  239. --PI--   
  240. select PI() --返回π的常量值   
  241. --FLOOR--   
  242. select floor(123.456)--取不大于123.456的最大整数   
  243. --SIN COS TAN COT--   
  244. select  SIN(PI())   
  245. select  COS(PI())   
  246. select  TAN(PI())   
  247. select  COT(PI())   
  248. --SQUARE POWER--   
  249. select square(3)--求平方   
  250. select power(4,2)--求4的2次方   
  251.   
  252. ----转换函数----   
  253. --CAST--   
  254. select cast('123.456' as float)   
  255. select cast (出生时间 as varchar(30)) as birsday from xs    
  256. --CONVERT--   
  257. select convert(varchar(30),123.456)   
  258. select convert(varchar(30),出生时间) as birsday from xs   
  259. select convert(varchar(20),getdate(),23)   
  260. select convert(varchar(20),getdate(),24)   
  261. ----日期和时间函数----   
  262. --GETDATE--   
  263. select getdate()--返回当前毫秒级时间   
  264. --DATEADD DATEDIFF--   
  265. select dateadd(day,10,getdate())--当前日期加10天   
  266. select datediff(month,'2005-7-30',getdate())--2005年8月9号距几天多少月(忽略零散的天数计算)   
  267.   
  268. --------创建用户类型--------   
  269. --创建用户自定义类型--   
  270. create type mytype   
  271.  from varchar(7)   
  272. --删除用户自定义类型--   
  273. drop type mytype   
  274. --通过系统存储过程创建用户自定义类型--   
  275. exec sp_addtype mytype2,   
  276.  'varchar(8)',   
  277.  'null'  
  278. --删除用户自定义类型--   
  279. drop type mytype2   
  280. --通过系统存储过程删除用户自定义类型--   
  281. sp_droptype 'mytype2'  
  282.   
  283. --------声明局部变量--------   
  284. declare @str varchar(8) ,@int1 int  
  285. set @str='welcome'  
  286. select @int1=7   
  287. print 'str:'+@str   
  288. print 'int1:'+str(@int1)   
  289.   
  290. select * from xs   
  291. declare @name varchar(20)   
  292. set @name='%s%'  
  293.  select *   
  294.  from xs    
  295.  where 姓名 like @name  
  296. select 姓名='user',学号=1,性别,专业名   
  297.  from xs   
  298. declare @mynumber int  
  299.  set @mynumber = 7-1+7/4*7   
  300.  select @mynumber   
  301. --------join查询--------   
  302. --创建临时表--   
  303. select * into xs_temp from xs   
  304. --内连接--   
  305. select * from xs inner join xs_temp on xs.学号=xs_temp.学号   
  306. --外连接--   
  307. select * from xs a full outer join xs_temp on xs.学号=xs_temp.学号   
  308. ----------------创建、管理登录名和用户----------------   
  309. ----登录----   
  310. --创建登录--   
  311. create login s_a with password = '1234'  
  312. create login [ntc02/ZhouYuan] from windows   
  313. sp_addlogin s_aaa,'123'  
  314.   
  315. --修改登录--   
  316. --修改登录名和密码--   
  317. alter login s_a with name=s_aa ,password='321'  
  318.   
  319. --使登录是否可用--   
  320. alter login s_aa disable   
  321. alter login s_aa enable   
  322.   
  323. --查看登录信息--   
  324. sp_helplogins s_aa   
  325.   
  326. --赋予登录名权限--   
  327. sp_addsrvrolemember s_a,'sysadmin'  
  328.   
  329. --删除登录--   
  330. drop login s_a   
  331. sp_droplogin s_aa   
  332.   
  333. ----用户----   
  334. --创建用户--   
  335. create user s_a --必须在创建login的前提下创建user   
  336. create user s_a for login s_a   
  337. sp_adduser s_aaa   
  338. --修改用户--   
  339. alter user s_a with NAME=s_aa   
  340.   
  341. --删除用户--   
  342. drop user s_aa   
  343. sp_dropuser s_aa   
  344. --赋予用户角色或权限--   
  345. sp_addsrvrolemember s_a,'sysadmin'  
  346.   
  347. ----------------创建、管理Default、rule、check约束----------------   
  348. --实体完整性   
  349. --实体完整性将行定义为特定表的唯一实体。实体完整性通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性强制表的标识符列或主键的完整性。   
  350. --域完整性   
  351. --域完整性指特定列的项的有效性。您可以强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用 CHECK 约束和规则)或限制可能值的范围(通过使用 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。   
  352. --引用完整性   
  353. --引用完整性通过 FOREIGN KEY 和 CHECK 约束    
  354. --用户定义完整性   
  355. --用户定义完整性使您可以定义不属于其他任何完整性类别的特定业务规则。   
  356. ----Default----   
  357. --创建表时创建默认值约束--   
  358. create table dfttest   
  359. (   
  360.  id smallint,   
  361.  proccessid int default @@spid,--@@spid 输出当前用户进程ID   
  362.  insertdate datetime default getdate(),   
  363.  innum smallint default 30*4,   
  364.  inname char(3),   
  365.  flag char(5) default 'hello'  
  366. )   
  367. --单独创建默认值约束--   
  368. create default dftname as 'dft'  
  369. --删除默认值约束--   
  370. drop default dftname   
  371. --为dfttest表的inname列绑定默认值约束--   
  372. sp_bindefault dftname,'dfttest.inname'  
  373. --为dfttest表的inname列解除绑定约束--   
  374. sp_unbindefault 'dfttest.inname'  
  375. --测试约束--   
  376. insert into dfttest (   
  377.  id   
  378. values(1)   
  379. select * from dfttest   
  380. ----Rule----   
  381. --创建规则--   
  382. create rule ru_name as @name like 'dft'  
  383.  --规则名:ru_name 该规则用于约束绑定该规则的列的每一个字段都必须和'dft'相同   
  384. --查看规则信息--   
  385. sp_help ru_name   
  386. --创建该规则的文本信息--   
  387. sp_helptext ru_name   
  388. --绑定该规则到表dfttest的列inname上--   
  389. sp_bindrule ru_name,'dfttest.inname'  
  390. --解除表dfttest列inname的规则绑定--   
  391. sp_unbindrule 'dfttest.inname'  
  392. --删除规则--   
  393. drop rule ru_name   
  394. --truncate table    
  395. truncate table dfttest   
  396.  --删除表中所有行,速度比delete快   
  397. ----check----   
  398. --创建表时创建check约束--   
  399. create table check_test   
  400. (   
  401.  id smallint identity(1,1)check (id>0 and id<10),   
  402.  inname char(3),   
  403.  flag char(5) default 'hello',   
  404.  constraint check_name check (inname like '[a][b][c]')   
  405. )   
  406. --测试以上约束--   
  407. drop table check_test   
  408. insert into check_test (inname) values ('abc')   
  409. --表创建后通过修改表创建check约束--   
  410. alter table check_test    
  411. add constraint check_name check(inname like 'abc%')   
  412. --通过修改表删除该表的指定的check约束--   
  413. alter table check_test   
  414. drop constraint check_name   
  415. --使用with nocheck可以在创建该约束时不验证该表现有的记录--   
  416. alter table check_test with nocheck   
  417. add constraint check_name1 check(inname like 'cba')   
  418. --通过删除该约束在系统中的名字删除该约束--   
  419. alter table check_test   
  420. drop constraint CK__check_test__id__740F363E   
  421. select * from check_test   
  422. ----unique约束----   
  423.  --unique 唯一约束主要用于约束被约束列唯一   
  424. --通过修改表的add constraint方法创建唯一约束--   
  425. alter table check_test with nocheck   
  426. add constraint unique_name unique(inname asc);   
  427. --通过alter drop删除该表的unique约束--   
  428. alter table check_test    
  429. drop constraint unique_name   
  430. ----除了以上约束之外,还有主键约束,外键约束,可借李伟的SQL2005参考查询   
  431.   
  432. ----------------------------存储过程、自定义函数、RAISERROR-------------------------------   
  433. -----------------存储过程-----------------   
  434. --接受输入参数并以输出参数的格式向调用过程或批处理返回多个值。   
  435. --包含用于在数据库中执行操作(包括调用其他过程)的编程语句。    
  436. --向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。   
  437. --create table Article--   
  438. create table Article   
  439. (   
  440.  NickName varchar(30) not null,   
  441.  Title varchar(30) not null,   
  442.  article varchar(maxnot null,   
  443.  date smalldatetime null    
  444. )   
  445. --create table Review--   
  446. create table Review   
  447. (   
  448.  Floor tinyint identity(1,1) not null,   
  449.  NickName varchar(30) not null,   
  450.  Title varchar(30) not null,   
  451.  Reviewor varchar(30) not null,   
  452.  Review varchar(200) not null,   
  453.  date smalldatetime null  
  454. )   
  455. --create table Members--   
  456. create table Members   
  457. (   
  458.  NickName varchar(30) not null,   
  459.  Password varchar(30) not null,   
  460.  [Namevarchar(30) not null,   
  461.  Age tinyint null,   
  462.  [e-mail] varchar(30) null,   
  463.  Address varchar(100) null  
  464. )   
  465. --create table Administrator--   
  466. create table Administrator   
  467. (   
  468.  Nickname varchar(30) not null,   
  469.  Password varchar(30) not null,   
  470.  Super bit null  
  471. )   
  472. --创建查看所有表的存储过程up_selectArt_Rew--   
  473. create procedure up_selectArt_Rew   
  474.  as  
  475. select * from article ,review ,members ,administrator   
  476. --执行存储过程up_selectArt_Rew--   
  477. up_selectArt_Rew   
  478. --创建向Review表中插入记录的存储过程up_insertRew--   
  479. create procedure up_insertRew   
  480. (   
  481.  @nickname varchar(20),   
  482.  @title varchar(50),   
  483.  @reviewor varchar(20),   
  484.  @review varchar(300)   
  485. )   
  486.  as  
  487. insert into dbo.review    
  488. (   
  489.  nickname,title,reviewor,review   
  490. )   
  491. values  
  492. (   
  493.  @nickname,@title,@reviewor,@review   
  494. )   
  495. --使用up_insertRew存储过程--   
  496. exec up_insertRew @nickname='t',@title='t',@reviewor='t',@review='t'  
  497. go   
  498. --删除up_insertRew存储过程--   
  499. drop proc up_insertRew   
  500. --显示该数据库中的所有表--   
  501. sys.sp_tables   
  502. --创建带输出参数output的存储过程select_name--   
  503. create procedure select_name   
  504. (   
  505.  @article varchar(100) output,   
  506.  @title varchar(40),   
  507.  @name varchar(10)   
  508. )   
  509.  as  
  510. select article from article where title=@title and nickname=@name  
  511. --使用存储过程select_name--   
  512. declare @art varchar(100)   
  513. exec select_name @art output,@title='first',@name='zhou'  
  514. print @art   
  515. --删除存储过程select_name--   
  516. drop proc select_name   
  517. --设置自动执行的存储过程--   
  518. create procedure auto_print   
  519.  as  
  520. print 'first auto print'  
  521. sp_procoption 'auto_print' ,'startup','true'  
  522. auto_print   
  523. --修改存储过程auto_print--   
  524. alter procedure auto_print   
  525.  as  
  526. print 'altered auto print'  
  527. auto_print   
  528. --加密存储过程auto_print--   
  529. alter procedure auto_print   
  530.  with encryption   
  531.  as  
  532. print 'altered and encryption auto print'  
  533. sp_helptext auto_print   
  534.  --对象 'auto_print' 的文本已加密。   
  535. --重新编译存储过程auto_print--   
  536. alter procedure auto_print   
  537.  with recompile   
  538.  as  
  539. print 'altered,encryption and recompiled auto print'  
  540. --删除存储过程auto_print--   
  541. if object_id ('auto_print','P'is not null  
  542.  drop procedure auto_print   
  543.   
  544. ------------------自定义函数-------------------   
  545. --与编程语言中的函数类似,Microsoft SQL Server 2005 用户定义函数是接受参数、   
  546. --执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。   
  547. --返回值可以是单个标量值或结果集。   
  548. --标量函数--   
  549.  --创建自定义函数fc,该函数有一个varchar类型的参数,一个int类型的返回值,   
  550.  --该函数主要用于返回xs_temp表中的以专业名计数的总数,没有的话就返回0   
  551. create function fc(@v varchar(10))   
  552.  returns int --注意返回的是int类型,而不是一个参数   
  553.  as  
  554.  begin  
  555.   declare @vsum int;   
  556.   select @vsum=count(*) from xs_temp --注意并不是@vsum=select count(*) from xs_temp   
  557.    where  专业名=@v;   
  558.   if (@vsum is null)   
  559.    set @vsum=0 --注意 设置一个参数的值时,要用set   
  560.   return @vsum   
  561.  end  
  562. --使用自定义函数fc--   
  563. declare @f varchar(10)   
  564.  set @f='fe'  
  565. select dbo.fc(@f) from xs_temp --注意 使用select 使用函数 而不是用exec   
  566. --内嵌表值函数--   
  567.  --创建自定义函数f_table,该函数有一个Int类型的参数,一个table类型的返回值   
  568.  --该函数用于返回xs_temp表中的所有数据   
  569. create function f_table(@f int)   
  570.  returns table --注意:在内嵌表值函数里,这里是returns 不是return   
  571.  as  
  572.  return(select * from xs_temp)   
  573. --删除自定义函数f_table--   
  574. drop function f_table   
  575. select function f_table() --注意:此处自定义函数的使用方法 不是select function f_table()   
  576. select * from dbo.f_table(3)   
  577. --多语句表值型函数--   
  578. alter function f_table (@f int)   
  579.  returns int table  
  580.  as  
  581.  begin  
  582.   declare @count  
  583.   return (select @count=count(*) from xs_temp)   
  584.  end  
  585. --该函数为找到解决办法,不能执行   
  586. ------------------------RAISERROR实例----------------------   
  587. --通过创建存储过程p1测试RAISERROR--   
  588. create procedure p1(@stime varchar(30),@etime varchar(30),@vday varchar(30) out)   
  589.  with encryption--加密   
  590.  as  
  591.   if @stime>@etime   
  592.    --print '开始时间大于结束时间'--注意:有raiserror的地方,只能有它自己一条语句,它比较特殊   
  593.    raiserror('开始时间大于结束时间',18,2)   
  594.   else  
  595.    select @vday=datediff(day,convert(datetime,@stime,120),convert(datetime,@etime,120))   
  596. exec p1 @stime='20090101',--注意 如果此处使用了 '@name = value' 形式之后,   
  597.   @etime='20100101',--所有后续的参数就必须以 '@name = value' 的形式传递。   
  598.   @vday1 output  
  599.   print @vday1   
  600. declare @vday1 varchar(30)   
  601. exec p1 '20090101',   
  602.   '20100101',   
  603.   @vday1 output  
  604.   print @vday1   
  605. --create function--   
  606. create function f1(@stime varchar(30),@etime varchar(30))   
  607.  returns varchar  
  608.  as  
  609.   begin  
  610.   declare @vday varchar(30);   
  611.   if @stime>@etime   
  612.    begin  
  613.    select @vday= @etime--print '开始时间大于结束时间'   
  614.    --raiserror('开始时间大于结束时间',18,2)   
  615.    end  
  616.   else  
  617.    begin  
  618.        
  619.     select @vday= @stime --(datediff(day,convert(datetime,@stime,120),convert(datetime,@etime,120)))   
  620.        
  621.    end  
  622.   return @vday   
  623.   end  
  624.  --消息 443,级别 16,状态 14,过程 f1,第 6 行   
  625.  --在函数内的 'PRINT' 中对带副作用的或依赖于时间的运算符的使用无效。   
  626.  --消息 443,级别 16,状态 14,过程 f1,第 9 行   
  627.  --在函数内的 'RAISERROR' 中对带副作用的或依赖于时间的运算符的使用无效。   
  628. --测试--   
  629. declare @vaday varchar(30),@stime varchar(30),@etime varchar(30)   
  630. set @stime='20090101'  
  631. set @etime='20100202'  
  632. select @vaday=datediff(day,convert(datetime,@stime,120),convert(datetime,@etime,120))   
  633.  print @vaday   
  634. ----------------------------DDL、DML触发器、游标-------------------------------   
  635. -------------DDL、DML触发器---------------   
  636. --DDL(Data Definition Language,数据定义语言):   
  637. --用于定义数据的结构,比如 创建、修改或者删除数据库对象.主要是以 CREATE、ALTER 和 DROP 开头的语句。   
  638. --创建触发器tr_1--   
  639. create trigger tr_1   
  640.  on database --注意:此处不能写成 all server 指定的事件类型对指定的目标对象无效。   
  641.  for create_table,alter_table,drop_table--注意:此处是create_table 不是create table   
  642.  as --注意:这儿要使用 as ,而不是什么都不写   
  643.   print '触发禁用表操作'  
  644.   rollback;   
  645. create table t_2    
  646. (   
  647.  id int    
  648. )   
  649. drop table t_1 --事务在触发器中结束。批处理已中止。   
  650. --删除触发器tr_1--   
  651. drop trigger tr_1 on all server--无法对 触发器'tr_1' 执行 删除,因为它不存在,或者您没有所需的权限。   
  652. drop trigger tr_1 on database--命令已成功完成。   
  653. --在服务器上创建触发器tr_1--   
  654. create trigger tr_1   
  655.  on all server   
  656.  for create_database,drop_database ,alter_database--注意:for 写在as 之前   
  657.  as  
  658.   print '触发器禁止数据库操作'  
  659.   rollback  
  660. create database db_1 --事务在触发器中结束。批处理已中止。   
  661. --在服务器上删除tr_1--   
  662. drop trigger tr_1 on all server   
  663. select * from test   
  664. --创建禁止创建,删除,修改登陆的触发器以及相关操作--   
  665. create trigger tr_1   
  666.  on database --注意:指定的事件类型对指定的目标对象无效。 不能用database,而要用all server   
  667.  for create_login,drop_login,alter_login   
  668.  as  
  669.  print '触发器禁止登陆操作'  
  670.  rollback  
  671. create trigger tr_1   
  672.  on all server   
  673.  for create_login,drop_login,alter_login   
  674.  as  
  675.  print '触发器禁止登陆操作'  
  676.  rollback transaction  
  677. create login lo_1 with password='1' --事务在触发器中结束。批处理已中止。   
  678. drop trigger tr_1 on all server   
  679. --修改触发器--   
  680. alter trigger tr_1    
  681.  on all server --注意:修改触发器时,不能修改这一部分   
  682.  for create_database,alter_database,drop_database   
  683.  as  
  684.   print 'Trigger ban such work'  
  685.  rollback  
  686. drop trigger tr_1 on all server   
  687. --禁用和解除禁用触发器--   
  688. disable trigger tr_1 on all server   
  689. enable trigger tr_1 on all server   
  690. ---------------------------DML 触发器--------------------------------   
  691. ------------------for,after触发器---------------------   
  692. select * from test   
  693. -------for触发器-----------   
  694. create trigger tr_1   
  695.  on test   
  696.  after insert  
  697.  as  
  698.   insert into test(tname,tage) values('ta',12)   
  699. drop trigger tr_1   
  700. insert into test values('ta',13)   
  701. -------update触发器-----------   
  702. create trigger tr_1   
  703.  on test    
  704.  for update  
  705.  as  
  706.   if update(tname)--注意:update(这里面写的是列名)   
  707.   begin --注意:如果 if内有多条语句,那么就需要用begin end   
  708.    print 'test table can not change'  
  709.    rollback transaction  
  710.   end  
  711. update  test set tname='china' where tage=12--事务在触发器中结束。批处理已中止。   
  712. drop trigger tr_1   
  713. --在视图上创建触发器--   
  714. create view v_t as select * from test   
  715. create trigger tr_1   
  716.  on v_t   
  717.  for insert -- 不能用for 或者 after 在视图上创建触发器   
  718.  as  
  719.   if update(tname)   
  720.   begin  
  721.    insert into test values('china',14)   
  722.   end  
  723. --------instead of触发器---------   
  724. create trigger tr_1    
  725.  on v_t   
  726.  instead of insert    
  727.  as  
  728.   if update(tname)   
  729.   begin  
  730.    insert into test values('china',14)    
  731.   end --命令已成功完成。   
  732. insert into v_t values(1,'japan',15)   
  733. select * from v_t select * from test   
  734. --结果:   
  735. --12 china 14   
  736. --13 china 14   
  737. --   
  738. --12 china 14   
  739. --13 china 14   
  740. drop trigger tr_1   
  741. ----------------------cursor-游标-------------------   
  742. -------游标操作-------   
  743. declare c_1 cursor    
  744. for  --此处用for 而不是as   
  745. select * from test   
  746. --打开游标--   
  747. open c_1   
  748. --获取数据--   
  749. fetch next from c_1   
  750. --关闭游标--   
  751. close c_1   
  752. --释放游标--   
  753. deallocate c_1   
  754. ----------游标使用实例-------------   
  755.     
  756. select * from test   
  757.  --声明变量   
  758. declare @ti int ,@tn varchar(10),@ta int  
  759.  --声明游标   
  760. declare c_1 cursor    
  761. for    
  762.  select * from test   
  763.  --打开游标   
  764.  open c_1   
  765.  --获取数据   
  766.  fetch next from c_1 into @ti,@tn,@ta   
  767.  --输出表test的下一行数据的后两列数据   
  768.  print @tn   
  769.  print @ta   
  770.  --判断下一行数据是否存在   
  771.  --  0   FETCH 语句成功。   
  772.  -- -1 FETCH 语句失败或行不在结果集中。   
  773.  -- -2 提取的行不存在。   
  774.  while @@fetch_status = 0   
  775.   begin  
  776.    if @tn='SQL'  
  777.     update test set tname='china' ,tage=15   
  778.     fetch next from c_1 into @ti,@tn,@ta   
  779.     print @tn   
  780.     print @ta   
  781.   end  
  782.  if @@fetch_status <>0   
  783.   print '执行完毕'  
  784.  close c_1   
  785.  deallocate c_1   
  786.   
  787. --------创建存储过程并在其中使用游标的实例--------   
  788. create procedure p_1   
  789. as  
  790. declare c_1 cursor  
  791. for select * from test   
  792.  open c_1   
  793.  fetch next from c_1    
  794.  while @@fetch_status =0   
  795.   begin  
  796.    update test set tname='japan',tage=154   
  797.   fetch next from c_1   
  798.   end  
  799.   if @@fetch_status <>0   
  800.    print 'Done'  
  801.  close c_1   
  802.  deallocate c_1   
  803. p_1  
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值