SQL 常用操作

[一篮饭特稀原创,转载请注明出处http://www.cnblogs.com/wanghafan/archive/2012/02/15/2352106.html]

--备份表

View Code
1 select * into F02_TF_RNFL_BACK from F02_TF_RNFL

--复制数据库

View Code
1 新建一个库B
2 B的右键-任务-导入数据,从A到B
3 A的右键-任务-生成脚本-...-勾选存储过程,导出到查询页
4 从查询页执行脚本到B

--分组 最新一条记录

View Code
1 select [EstimatedIncomeT].*  
2 from [EstimatedIncomeT],
3 (
4 select ProjectID,max(EstimatedDate) as EstimatedDate from [EstimatedIncomeT] group by ProjectID
5 ) a
6 where [EstimatedIncomeT].EstimatedDate=a.EstimatedDate AND [EstimatedIncomeT].ProjectID=a.ProjectID

--计算两个记录之间某字段的差值 

View Code
1 SELECT a.*,(a.费用 - b.费用 ) as 差额费用
2 from tb a
3 left join tb b
4 on a.IID=b.IID+1

--行号 

View Code
1 select CAST(ROW_NUMBER() OVER(order by Name) AS varchar(32)) AS rowindex

--联合查询 后 排序 

View Code
 1 要求:
2 在一个语句中完成先按县市雨量值从大到小排,最后排全市雨量平均值
3
4 语句:
5 select stnm,val,0 as OrderID from M_RNFL_R
6 union
7 select '全市' as stnm,avg(val),1 as OrderID from (select val from M_RNFL_R) as A
8 order by OrderID asc,val desc
9
10 结果:
11 stnm val
12 温岭 258.1
13 玉环 256.2
14 路桥 222.7
15 黄岩 161.0
16 椒江 139.1
17 三门 123.7
18 临海 97.6
19 仙居 57.3
20 天台 45.5
21 全市 151.3

--截取时间 

View Code
1 select datepart(yyyy,getdate()) 
2 select datepart(mm,getdate())
3 select datepart(dd,getdate())
4 select datepart(hh,getdate())

--读取库中的所有表名  

View Code
1 SELECT 'select * from ' +  name from sysobjects where xtype='u'

--读取指定表的所有列名  

View Code
1 select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')

--更新字段里的空格 

View Code
1 update 表名 set 字段名=REPLACE(字段名,' ','')

--批量插入数据

View Code
1 全部字符串
2 select 'insert into M01_ST_RVFCCH_B (STCD,WRZ,GRZ) values('''+STCD+''','''+TFLZ+''','''+MFLZ+''')'
3 from INFO_LRFLZ_B
4 包含整型rec_id
5 select ' update txl_person set rec_id='+ cast(rec_id as varchar(20)) +' where pname='''+[name]+''' ' from A03_RECIPIENT

--获取日期部分 

View Code
1 更新获取的日期部分:实际上是在原有日期上加上相应天数
2 update M02_ST_RIVER_R0 set TM=dateadd( day, 10, tm ) where tm>='2008-11-29' and tm<'2008-11-30'
3 获取到小时
4 1.字符串:select convert(varchar(10),getdate(),020) + ' ' + datename(hour,getdate())+':00:00.000'
5 2.日期型:cast((convert(varchar(10),getdate(),020) + ' ' + datename(hour,getdate())+':00:00.000') as datetime)

--日期时间转字符串 

View Code
 1 Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM 
2 Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
3 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
4 Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
5 Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
6 Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
7 Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
8 Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
9 Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
10 Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
11 Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
12 Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
13 Select CONVERT(varchar(100), GETDATE(), 12): 060516
14 Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
15 Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
16 Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
17 Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
18 Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
19 Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
20 Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
21 Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
22 Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
23 Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
24 Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
25 Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
26 Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
27 Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
28 Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
29 Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
30 Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
31 Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
32 Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
33 Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
34 Select CONVERT(varchar(100), GETDATE(), 112): 20060516
35 Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
36 Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
37 Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
38 Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
39 Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
40 Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM

--用变量名作为表名的解决方案 

View Code
 1 情景:
2   写procedure时要根据特定变量的值动态创建table(表名是全部或部分特定变量的值)。例如:
3   declare @tablename char(10)
4   set @tablename='test'
5 想用变量@tablename的值作为表名创建一个新表,那么create table @tablename (test char(8))在SQL server 2k中执行就会遇到问题,
6   
7 解决:
8   //如果表不存在则创建
9   IF not EXISTS (SELECT name FROM sysobjects   
10   WHERE name =@tablename AND type = 'U')
11   begin
12   set
13   @createtable='create table '+ @tablename+' (myname char(2))'
14   exec(@createtable)
15   end

--重命名列 

View Code
1 下例将表 customers 中的列 contact title 重命名为 title。 
2 EXEC sp_rename 'customers.[contact title]', 'title', 'COLUMN'

--修改表结构 

View Code
1 ALTER TABLE W02_ZHLXR ADD town varchar(20) null
2 ALTER TABLE W02_ZHLXR ADD ScaleLevel varchar(50) null

--生成随机数 

View Code
1 0至N-1之间,如cast( floor(rand()*100) as int)就会生成0至99之间任一整数 
2 1至N之间,如cast(ceiling(rand() * 100) as int)就会生成1至100之间任一整数

--建表 

View Code
1 create table SC 
2 (
3 sno char(6),
4 cno char (8),
5 constraint PK_SC primary key (sno,cno),
6 constraint FK_s foreign key (sno) references S(sno),
7 constraint FK_c foreign key (cno) references C(cno)
8 )

--insert select 

View Code
1 错误:insert into w01_setup (stcd,isshow,isshowrep)
2 (SELECT distinct(stcd) FROM M01_ST_STBPRP_B WHERE sttp IN ('1', '3'),11
3 正确:insert into w01_setup (stcd,isshow,isshowrep)
4 SELECT distinct(stcd),1,1 FROM M01_ST_STBPRP_B WHERE sttp IN ('1', '3')

--用visio 2003建立sql server反向工程 

View Code
 1 <1>建立数据源
2 打开控制面板—>管理工具—>数据源 (ODBC),或直接运行odbccp32.cpl命令。打开ODBC数据源管理器。添加一个系统数据源。选择Sql Server作为数据源的驱动程序,键入数据源名称demo,选择合适的sql server服务器,然后一路默认下去。(在后面的步骤中可以选择需要进行反向工程的数据库,默认是master)数据源信息如图一示。
3 <2>在visio中新建数据库模型图
4 打开visio 2003,文件—>新建—>数据库—>数据库模型图。建立数据库模型图之后,菜单栏多出一个菜单项"数据库"
5 <3>反向工程
6 菜单项数据库—>反向工程。启动反向工程向导,一步步完成反向工程设置。
7 1.建立与数据库的连接。选择visio驱动程序的类型决定了可以连接的数据库类型及可用选项。数据源指定数据库位置及连接信息。这里我们选择visio驱动程序为Microsoft Sql Server,数据源为刚建立的demo。如图二示。
8 2.连接数据源。输入用户名和密码用于连接数据源。
9 3.选择要进行反向工程的对象类型,如图三示。
10 4.选择要进行反向工程的表和视图。
11 5.选择要进行么向工程的存储过程。
12 6.是否想让选择了反向工程的项添加到当前工程中。选择是才能生成图。
13 结果大致向下面这样。

--查找存储过程中出现过的文字 

View Code
1 在syscomments系统表里查,结合sysobjects系统表取得过程名
2 select b.name from 数据库名.dbo.syscomments a,数据库名.dbo.sysobjects b where a.id=b.id and b.xtype='p' and a.text like '%insert into%'
3 “数据库名”替换成你实际的数据库名,因为每个数据库里的存储过程都是单独保存在自己数据库的syscomments表内,所以要加上数据库名,这样就不用在切换数据库上下文了。另外加密的存储过程是查不出来的。


posted @ 2012-02-15 09:33  一篮饭特稀  阅读(330)  评论(0编辑  收藏  举报