1. --========================
  2. --设置内存选项
  3. --========================
  4.  
  5. --设置 min server memory 配置项
  6. EXEC sp_configure N'min server memory (MB)',0
  7. --设置 max server memory 配置项
  8. EXEC sp_configure N'max server memory (MB)',256
  9. --使更新生效
  10. RECONFIGURE WITH OVERRIDE
  11.  
  12. --============================================================
  13.  
  14. ========================
  15.  
  16. 使用文件及文件组.sql
  17.  
  18. ========================
  19.  
  20. /*--功能说明 下面的代码是在SQL Server 2000上创建名为 MyDB 的数据库
  21. 该数据库包括1个主要数据文件、3个用户定义的文件组和1个日志文件
  22. ALTER DATABASE语句将用户定义文件组指定为默认文件组。
  23. 之后,通过指默认的文件组来创建表,并且将图像数据和索引放到指定的文件组中。
  24. 最后,将文件组中的指定数据文件删除 --*/
  25. --切换到 master 数据库
  26. USE master
  27. GO
  28. --A. 创建数据库 MyDB
  29. CREATE DATABASE MyDB
  30. ON PRIMARY --主文件组和主要数据文件
  31. ( NAME='MyDB_Primary',
  32. FILENAME= 'c:\MyDB_Prm.mdf'
  33. ),
  34. FILEGROUP MyDB_FG1 --用户定义文件组1
  35. (
  36. NAME= 'MyDB_FG1_Dat1',
  37. FILENAME= 'c:\MyDB_FG1_1.ndf'
  38. ),
  39. --次要数据文件1
  40. (
  41. NAME= 'MyDB_FG1_Dat2',
  42. FILENAME= 'd:\MyDB_FG1_2.ndf'
  43. ),
  44. --次要数据文件2
  45. FILEGROUP MyDB_FG2--用户定义文件组2
  46. (
  47. NAME= 'MyDB_FG1_Dat',
  48. FILENAME= 'e:\MyDB_FG2.ndf'
  49. ),
  50. --次要数据文件LOG ON --日志文件
  51. (
  52. NAME='MyDB_log',
  53. FILENAME='d:\MyDB.ldf'
  54. )
  55.  
  56. --DUMP TRANSACTION MyDB WITH NO_LOG and truncate_only
  57. GO
  58.  
  59. --B. 修改默认数据文件组
  60. ALTER DATABASE MyDB
  61. MODIFY FILEGROUP MyDB_FG1 DEFAULT
  62. GO
  63. ---切换到新建的数据库 MyDB
  64. USE MyDB
  65.  
  66. --C. 在默认文件组MyDB_FG1创建表,并且指定图像数据保存在用户定义文件组MMyDB_FG2
  67. CREATE TABLE MyTable
  68. (
  69. cola int PRIMARY KEY ,
  70. colb char(8) ,
  71. colc image
  72. )
  73. TEXT IMAGE_ON MyDB_FG2
  74. --在用户定义文件组MyDB_FG2上创建索引
  75. CREATE INDEX IX_MyTable
  76. ON MyTable(cola)
  77. ON MyDB_FG2
  78. GO
  79.  
  80. --D. 将要删除数据文件MyDB_FG1_Dat1上的数据转移到其他数据文件中,
  81. -- 并且清空数据文件MyDB_FG1_Dat1
  82. DBCC SHRINKFILE(MyDB_FG1_Dat1,EMPTYFILE)
  83. --删除数据文件MyDB_FG1_Dat1
  84. ALTER DATABASE MyDB REMOVE FILE MyDB_FG1_Dat1
  85.  
  86. --==========================================================================
  87.  
  88. --===============================
  89.  
  90. 调整数据库的文件属性.sql
  91.  
  92. --===============================
  93.  
  94. --A. tempdb数据库的主数据文件大小设置为10MB
  95. ALTER DATABASE tempdb
  96. MODIFY FILE( name=tempdev, size=100 MB)
  97. GO
  98. --B. tempdb数据库的主数据文件移动到指定的磁盘分区上,并且为其添加一个数据文件。
  99. --移动主数据文件
  100. ALTER DATABASE tempdb
  101. MODIFY FILE ( NAME='tempdev', FILENAME='d:\tempdb.mdf')
  102. --添加次要数据文件
  103. ALTER DATABASE tempdb
  104. ADD FILE ( NAME='tempdata_1', FILENAME='d:\tempdb_data_1.ndf')
  105.  
  106. --============================================================================
  107.  
  108. --===============================
  109.  
  110. 日期概念理解中的一些测试.sql
  111.  
  112. --===============================
  113.  
  114. --A. 测试 datetime 精度问题
  115. DECLARE @t TABLE(date char(21))
  116. INSERT @t SELECT '1900-1-1 00:00:00.000'
  117. INSERT @t SELECT '1900-1-1 00:00:00.001'
  118. INSERT @t SELECT '1900-1-1 00:00:00.009'
  119. INSERT @t SELECT '1900-1-1 00:00:00.002'
  120. INSERT @t SELECT '1900-1-1 00:00:00.003'
  121. INSERT @t SELECT '1900-1-1 00:00:00.004'
  122. INSERT @t SELECT '1900-1-1 00:00:00.005'
  123. INSERT @t SELECT '1900-1-1 00:00:00.006'
  124. INSERT @t SELECT '1900-1-1 00:00:00.007'
  125. INSERT @t SELECT '1900-1-1 00:00:00.008'
  126. SELECT date,转换后的日期=CAST(date as datetime)
  127. FROM @t
  128. /*--结果 date 转换后的日期
  129. --------------------- --------------------------
  130. 1900-1-1 00:00:00.000
  131. 1900-01-01 00:00:00.000
  132. 1900-1-1 00:00:00.001
  133. 1900-01-01 00:00:00.000
  134. 1900-1-1 00:00:00.009
  135. 1900-01-01 00:00:00.010
  136. 1900-1-1 00:00:00.002
  137. 1900-01-01 00:00:00.003
  138. 1900-1-1 00:00:00.003
  139. 1900-01-01 00:00:00.003
  140. 1900-1-1 00:00:00.004
  141. 1900-01-01 00:00:00.003
  142. 1900-1-1 00:00:00.005
  143. 1900-01-01 00:00:00.007
  144. 1900-1-1 00:00:00.006
  145. 1900-01-01 00:00:00.007
  146. 1900-1-1 00:00:00.007
  147. 1900-01-01 00:00:00.007
  148. 1900-1-1 00:00:00.008
  149. 1900-01-01 00:00:00.007
  150. (所影响的行数为 10 行) --
  151. */
  152. GO
  153. --B. 对于 datetime 类型的纯日期和时间的十六进制表示
  154. DECLARE @dt datetime
  155. --单纯的日期
  156. SET @dt='1900-1-2'SELECT CAST(@dt as binary(8))
  157. --结果: 0x0000000100000000
  158. --单纯的时间
  159. SET @dt='00:00:01'SELECT CAST(@dt as binary(8))
  160. --结果: 0x000000000000012CGO
  161. --C. 对于 smalldatetime 类型的纯日期和时间的十六进制表示
  162. DECLARE @dt smalldatetime
  163. --单纯的日期
  164. SET @dt='1900-1-2'SELECT CAST(@dt as binary(4))
  165. --结果: 0x00010000
  166. --单纯的时间
  167. SET @dt='00:10'SELECT CAST(@dt as binary(4))
  168. --结果: 0x0000000A
  169.  
  170. --======================================================================
  171.  
  172. --=================================
  173.  
  174. 在日期转换中的使用示例.sql
  175.  
  176. --=================================
  177.  
  178. --字符转换为日期时,Style的使用
  179. --1. Style=101时,表示日期字符串为:mm/dd/yyyy格式
  180. SELECT CONVERT(datetime,'11/1/2003',101)
  181. --结果:2003-11-01 00:00:00.000
  182. --2. Style=101时,表示日期字符串为:dd/mm/yyyy格式
  183. SELECT CONVERT(datetime,'11/1/2003',103)
  184. --结果:2003-01-11 00:00:00.000
  185. /*== 日期转换为字符串 ==*/
  186. DECLARE @dt datetime
  187. SET @dt='2003-1-11'
  188. --1. Style=101时,表示将日期转换为:mm/dd/yyyy 格式
  189. SELECT CONVERT(varchar,@dt,101)
  190. --结果:01/11/2003--2. Style=103时,表示将日期转换为:dd/mm/yyyy 格式
  191. SELECT CONVERT(varchar,@dt,103)
  192. --结果:11/01/2003
  193. /*== 这是很多人经常犯的错误,对非日期型转换使用日期的style样式 ==*/
  194. SELECT CONVERT(varchar,'2003-1-11',101)
  195. --结果:2003-1-11
  196.  
  197. --=====================================================================
  198.  
  199. --=============================
  200.  
  201. 对日期处理的影响.sql
  202.  
  203. --=============================
  204.  
  205. --1.
  206. /*--
  207. 说明 SET DATEFORMAT设置对使用CONVERT把字符型日期转换为日期的处理也具有影响
  208. 但不影响明确指定了style的CONVERT处理。
  209. --*/
  210. --示例 ,在下面的示例中,第一个CONVERT转换未指定style,转换的结果受SET DATAFORMAT
  211. --影响,第二个CONVERT转换指定了style,转换结果受style的影响。
  212. --设置输入日期顺序为 日/月/年
  213. SET DATEFORMAT DMY
  214. --不指定Style参数的CONVERT转换将受到SET DATEFORMAT的影响
  215. SELECT CONVERT(datetime,'2-1-2005')
  216. --结果: 2005-01-02 00:00:00.000
  217. --指定Style参数的CONVERT转换不受SET DATEFORMAT的影响
  218. SELECT CONVERT(datetime,'2-1-2005',101)
  219. --结果: 2005-02-01 00:00:00.000GO
  220. --2.
  221. /*--
  222. 说明 如果输入的日期包含了世纪部分,则对日期进行解释处理时
  223. 年份的解释不受SET DATEFORMAT设置的影响。
  224. --*/
  225. --示例,在下面的代码中,同样的SET DATEFORMAT设置,输入日期的世纪部分与不输入日期的
  226. --世纪部分,解释的日期结果不同。
  227. DECLARE @dt datetime
  228. --设置SET DATEFORMAT为:月日年
  229. SET DATEFORMAT MDY
  230. --输入的日期中指定世纪部分
  231. SET @dt='01-2002-03'SELECT @dt
  232. --结果: 2002-01-03 00:00:00.000
  233. --输入的日期中不指定世纪部分
  234. SET @dt='01-02-03'SELECT @dt
  235. --结果: 2003-01-02 00:00:00.000GO
  236. --3.
  237. /*--
  238. 说明 如果输入的日期不包含日期分隔符,那么SQL Server在对日期进行解释时
  239. 将忽略SET DATEFORMAT的设置。
  240. --*/
  241. --示例,在下面的代码中,不包含日期分隔符的字符日期,在不同的SET DATEFORMAT设置下,
  242. --其解释的结果是一样的。
  243. DECLARE @dt datetime
  244. --设置SET DATEFORMAT为:月日年
  245. SET DATEFORMAT MDY
  246. SET @dt='010203'SELECT @dt
  247. --结果: 2001-02-03 00:00:00.000
  248. --设置SET DATEFORMAT为:日月年
  249. SET DATEFORMAT DMY
  250. SET @dt='010203'SELECT @dt
  251. --结果: 2001-02-03 00:00:00.000
  252. --输入的日期中包含日期分隔符
  253. SET @dt='01-02-03'SELECT @dt
  254. --结果: 2003-02-01 00:00:00.000
  255.  
  256. --==============================================================================
  257.  
  258. --===================================
  259.  
  260. 对日期处理的影响示例.sql
  261.  
  262. --===================================
  263.  
  264. --以下示例演示了在不同的语言环境(SET LANGUAGE)下,DATENAMECONVERT函数的不同结果。
  265. USE master
  266. --设置会话的语言环境为: English
  267. SET LANGUAGE N'English'
  268. SELECT DATENAME(Month,GETDATE())AS [Month],
  269. DATENAME(Weekday,GETDATE())AS [Weekday],
  270. CONVERT(varchar,GETDATE(),109)AS [CONVERT]
  271. /*--
  272. 结果: Month Weekday CONVERT
  273. ------------- -------------- -------------------------------
  274. March Tuesday Mar 15 2005 8:59PM
  275. --*/
  276. --设置会话的语言环境为: 简体中文
  277. SET LANGUAGE N'简体中文'
  278. SELECT DATENAME(Month,GETDATE())AS [Month],
  279. DATENAME(Weekday,GETDATE())AS [Weekday],
  280. CONVERT(varchar,GETDATE(),109)AS [CONVERT]
  281. /*--结果 Month Weekday CONVERT
  282. ------------- --------------- -----------------------------------------
  283. 05 星期四 05 19 2005 2:49:20:607PM
  284. --*/
  285.  
  286. --=======================================================================
  287.  
  288. --==================================
  289.  
  290. 日期格式化处理.sql
  291.  
  292. --==================================
  293.  
  294. DECLARE @dt datetime
  295. SET @dt=GETDATE()
  296. --1.短日期格式:yyyy-m-d
  297. SELECT REPLACE(CONVERT(varchar(10),@dt,120),N'-0','-')
  298. --2.长日期格式:yyyymmdd
  299. --A. 方法1
  300. SELECT STUFF(STUFF(CONVERT(char(8),@dt,112),5,0,N'年'),8,0,N'月')+N'日'
  301. --B. 方法2
  302. SELECT DATENAME(Year,@dt)+N'年'
  303. +DATENAME(Month,@dt)+N'月'
  304. +DATENAME(Day,@dt)+N'日'
  305. --3.长日期格式:yyyymd
  306. SELECT DATENAME(Year,@dt)+N'年'
  307. +CAST(DATEPART(Month,@dt)AS varchar)+N'月'
  308. +DATENAME(Day,@dt)+N'日'
  309. --4.完整日期+时间格式:yyyy-mm-dd hh:mi:ss:mmm
  310. SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)
  311.  
  312. --================================================================
  313.  
  314. --========================
  315.  
  316. 日期推算处理.sql
  317.  
  318. --========================
  319.  
  320. DECLARE @dt datetime
  321. SET @dt=GETDATE()
  322. DECLARE @number int
  323. SET @number=3
  324. --1.指定日期该年的第一天或最后一天
  325. --A. 年的第一天
  326. SELECT CONVERT(char(5),@dt,120)+'1-1'
  327. --B. 年的最后一天
  328. SELECT CONVERT(char(5),@dt,120)+'12-31'
  329. --2.指定日期所在季度的第一天或最后一天
  330. --A. 季度的第一天
  331. SELECT CONVERT(datetime,CONVERT(char(8),
  332. DATEADD(Month,DATEPART(Quarter,@dt)*3
  333. -Month(@dt)-2,@dt),120)+'1')
  334. --B. 季度的最后一天(CASE判断法)
  335. SELECT CONVERT(datetime,CONVERT(char(8),
  336. DATEADD(Month,DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)
  337. +CASE WHEN DATEPART(Quarter,@dt)in(1,4)THEN '31'ELSE '30' END)
  338. --C. 季度的最后一天(直接推算法)
  339. SELECT DATEADD(Day,-1,CONVERT(char(8),
  340. DATEADD(Month,1+DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)+'1')
  341. --3.指定日期所在月份的第一天或最后一天
  342. --A. 月的第一天
  343. SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')
  344. --B. 月的最后一天
  345. SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')
  346. --C. 月的最后一天(容易使用的错误方法)
  347. SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))
  348. --4.指定日期所在周的任意一天
  349. SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)
  350. --5.指定日期所在周的任意星期几
  351. --A. 星期天做为一周的第1
  352. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)
  353. --B. 星期一做为一周的第1
  354. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)
  355.  
  356. --============================================================================
  357.  
  358. --================================
  359.  
  360. 查询指定日期段内过生日的人员.sql
  361.  
  362. --================================
  363.  
  364. --测试数据
  365. DECLARE @t TABLE(ID int,Name varchar(10),Birthday datetime)
  366. INSERT @t
  367. SELECT 1,'aa','1999-01-01'UNION ALL
  368. SELECT 2,'bb','1996-02-29'UNION ALL
  369. SELECT 3,'bb','1934-03-01'UNION ALL
  370. SELECT 4,'bb','1966-04-01'UNION ALL
  371. SELECT 5,'bb','1997-05-01'UNION ALL
  372. SELECT 6,'bb','1922-11-21'UNION ALL
  373. SELECT 7,'bb','1989-12-11'
  374. DECLARE @dt1 datetime,@dt2 datetime
  375. --查询 2003-12-05 2004-02-28 生日的记录
  376. SELECT @dt1='2003-12-05',@dt2='2004-02-28'
  377. SELECT * FROM @t
  378. WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
  379. BETWEEN @dt1 AND @dt2 OR DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
  380. BETWEEN @dt1 AND @dt2
  381. /*--结果 ID Name Birthday
  382. ---------------- ---------------- --------------------------
  383. 1 aa 1999-01-01 00:00:00.000
  384. 7 bb 1989-12-11 00:00:00.000
  385. --*/
  386. --查询 2003-12-05 2006-02-28 生日的记录
  387. SET @dt2='2006-02-28'
  388. SELECT * FROM @t
  389. WHERE DATEADD(Year,DATEDIFF(Year,Birthday,@dt1),Birthday)
  390. BETWEEN @dt1 AND @dt2 OR DATEADD(Year,DATEDIFF(Year,Birthday,@dt2),Birthday)
  391. BETWEEN @dt1 AND @dt2
  392. /*
  393. --查询结果 ID Name Birthday
  394. ---------------- ----------------- --------------------------
  395. 1 aa 1999-01-01 00:00:00.000
  396. 2 bb 1996-02-29 00:00:00.000
  397. 7 bb 1989-12-11 00:00:00.000
  398. --*/
  399.  
  400. --=========================================================================
  401.  
  402. --==========================
  403.  
  404. 生成日期列表的函数.sql
  405.  
  406. --==========================
  407.  
  408. DECLARE @dt datetime
  409. SET @dt=GETDATE()
  410. DECLARE @number int
  411. SET @number=3
  412. --1.指定日期该年的第一天或最后一天
  413. --A. 年的第一天
  414. SELECT CONVERT(char(5),@dt,120)+'1-1'
  415. --B. 年的最后一天
  416. SELECT CONVERT(char(5),@dt,120)+'12-31'
  417. --2.指定日期所在季度的第一天或最后一天
  418. --A. 季度的第一天
  419. SELECT CONVERT(datetime,
  420. CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,@dt)*3-Month(@dt)-2,@dt),120)+'1')
  421. --B. 季度的最后一天(CASE判断法)
  422. SELECT CONVERT(datetime,
  423. CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)
  424. +CASE WHEN DATEPART(Quarter,@dt)in(1,4)THEN '31'ELSE '30' END)
  425. --C. 季度的最后一天(直接推算法)
  426. SELECT DATEADD(Day,-1,
  427. CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)+'1')
  428. --3.指定日期所在月份的第一天或最后一天
  429. --A. 月的第一天
  430. SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')
  431. --B. 月的最后一天
  432. SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')
  433. --C. 月的最后一天(容易使用的错误方法)
  434. SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))
  435. --4.指定日期所在周的任意一天
  436. SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)
  437. --5.指定日期所在周的任意星期几
  438. --A. 星期天做为一周的第1
  439. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)
  440. --B. 星期一做为一周的第1
  441. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)
  442.  
  443. --=========================================================================
  444.  
  445. --===================
  446.  
  447. 复杂年月处理.sql
  448.  
  449. --===================
  450.  
  451. --定义基本数字表
  452. declare @T1 table(代码 int,名称 varchar(10),参加时间 datetime,终止时间 datetime)
  453. insert into @T1 select 12,'单位1','2003/04/01','2004/05/01' union all
  454. select 22,'单位2','2001/02/01','2003/02/01' union all
  455. select 42,'单位3','2000/04/01','2003/05/01' union all
  456. select 25,'单位5','2003/04/01','2003/05/01'
  457. --定义年表
  458. declare @NB table(代码 int,名称 varchar(10),年份 int)
  459. insert into @NB
  460. select 12,'单位1',2003 union all
  461. select 12,'单位1',2004 union all
  462. select 22,'单位2',2001 union all
  463. select 22,'单位2',2002 union all
  464. select 22,'单位2',2003
  465. --定义月表
  466. declare @YB table(代码 int,名称 varchar(10),年份 int,月份 varchar(2))
  467. insert into @YB
  468. select 12,'单位1',2003,'04' union all
  469. select 22,'单位2',2001,'01' union all
  470. select 22,'单位2',2001,'12'
  471. --为年表+月表数据处理准备临时表
  472. select top 8246 y=identity(int,1753,1)into #tby from
  473. (select id from syscolumns) a,
  474. (select id from syscolumns) b,
  475. (select id from syscolumns) c
  476. --为月表数据处理准备临时表
  477. select top 12 m=identity(int,1,1)into #tbm from syscolumns
  478. /*--数据处理--*/
  479. --年表数据处理
  480. select a.*from
  481. (select a.代码,a.名称,年份=b.y from @T1 a,#tby b
  482. where b.y between year(参加时间)and year(终止时间) )
  483. a left join @NB b
  484. on a.代码=b.代码 and a.年份=b.年份
  485. where b.代码 is null
  486. --月表数据处理
  487. select a.* from
  488. (select a.代码,a.名称,年份=b.y,
  489. 月份=right('00'+cast(c.m as varchar),2)from @T1 a,#tby b,#tbm c
  490. where b.y*100+c.m between
  491. convert(varchar(6),参加时间,112)and convert(varchar(6),终止时间,112) ) a
  492. left join @YB b on a.代码=b.代码
  493. and a.年份=b.年份
  494. and a.月份=b.月份 where b.代码 is null
  495. order by a.代码,a.名称,a.年份,a.月份
  496. --删除数据处理临时表
  497. drop table #tby,#tbm
  498.  
  499. --=========================================================================
  500.  
  501. --============================
  502.  
  503. 交叉表.sql
  504.  
  505. --============================
  506.  
  507. --示例--示例数据
  508. create table tb(ID int,Time datetime)
  509. insert tb
  510. select 1,'2005/01/24 16:20'union all
  511. select 2,'2005/01/23 22:45'union all
  512. select 3,'2005/01/23 0:30'union all
  513. select 4,'2005/01/21 4:28'union all
  514. select 5,'2005/01/20 13:22'union all
  515. select 6,'2005/01/19 20:30'union all
  516. select 7,'2005/01/19 18:23'union all
  517. select 8,'2005/01/18 9:14'union all
  518. select 9,'2005/01/18 18:04'
  519. go
  520. --查询处理:
  521. select case when grouping(b.Time)=1
  522. then 'Total'
  523. else b.Time end,
  524. [Mon]=sum(case a.week when 1 then 1 else 0 end),
  525. [Tue]=sum(case a.week when 2 then 1 else 0 end),
  526. [Wed]=sum(case a.week when 3 then 1 else 0 end),
  527. [Thu]=sum(case a.week when 4 then 1 else 0 end),
  528. [Fri]=sum(case a.week when 5 then 1 else 0 end),
  529. [Sat]=sum(case a.week when 6 then 1 else 0 end),
  530. [Sun]=sum(case a.week when 0 then 1 else 0 end),
  531. [Total]=count(a.week)from
  532. (select Time=convert(char(5),dateadd(hour,-1,Time),108),
  533. --时间交界点是1am,所以减1小时,避免进行跨天处理
  534. week=(@@datefirst+datepart(weekday,Time)-1)%7
  535. --考虑@@datefirstdatepart的影响
  536. from tb ) a
  537. right join
  538. (select id=1,a='16:00',b='19:59',Time='[5pm - 9pm)' union all
  539. select id=2,a='20:00',b='23:59',Time='[9pm - 1am)' union all
  540. select id=3,a='00:00',b='02:59',Time='[1am - 4am)' union all
  541. select id=4,a='03:00',b='07:29',Time='[4am - 8:30am)' union all
  542. select id=5,a='07:30',b='11:59',Time='[8:30am - 1pm)' union all
  543. select id=6,a='12:00',b='15:59',Time='[1pm - 5pm)')
  544. b on a.Time>=b.a and a.Time<b.b
  545. group by b.id,b.Time
  546. with rollup having grouping(b.Time)=0 or grouping(b.id)=1
  547. go
  548. --删除测试
  549. drop table tb
  550. /*--
  551. 测试结果 Mon Tue Wed Thu Fri Sat Sun Total
  552. -------------- ----- ----- ----- ----- ----- ------ ---- -------
  553. [5pm - 9pm) 0 1 2 0 0 0 0 3
  554. [9pm - 1am) 0 0 0 0 0 0 2 2
  555. [1am - 4am) 0 0 0 0 0 0 0 0
  556. [4am - 8:30am) 0 0 0 0 1 0 0 1
  557. [8:30am - 1pm) 0 1 0 0 0 0 0 1
  558. [1pm - 5pm) 1 0 0 1 0 0 0 2
  559. Total 1 2 2 1 1 0 2 9 (
  560. 所影响的行数为 7 行)
  561. --*/
  562.  
  563. --=======================================================================
  564.  
  565. --======================
  566.  
  567. 统计交叉表日期优先.sql
  568.  
  569. --=====================
  570.  
  571. --交叉表,根据优先级取数据,日期处理
  572. create table tb(qid int,rid nvarchar(4),tagname nvarchar(10),
  573. starttime smalldatetime,endtime smalldatetime,startweekday int,
  574. endweekday int,startdate smalldatetime,enddate smalldatetime,d int)
  575. insert tb
  576. select 1,'A1','未订','08:00','09:00',1 ,5 ,null ,null ,1 union all
  577. select 1,'A1','未订','09:00','10:00',1 ,5 ,null ,null ,1 union all
  578. select 1,'A1','未订','10:00','11:00',1 ,5 ,null ,null ,1 union all
  579. select 1,'A1','装修','08:00','09:00',null,null,'2005-1-18','2005-1-19',2 --union all
  580. select 1,'A1','装修','09:00','10:00',null,null,'2005-1-18','2005-1-19',2 union all
  581. select 1,'A1','装修','10:00','11:00',null,null,'2005-1-18','2005-1-19',2 union all
  582. select 1,'A2','未订','08:00','09:00',1 ,5 ,null ,null ,1 union all
  583. select 1,'A2','未订','09:00','10:00',1 ,5 ,null ,null ,1 union all
  584. select 1,'A2','未订','10:00','11:00',1 ,5 ,null ,null ,1--union all
  585. select 1,'A2','装修','08:00','09:00',null,null,'2005-1-18','2005-1-19',2 union all
  586. select 1,'A2','装修','09:00','10:00',null,null,'2005-1-18','2005-1-19',2 --union all
  587. select 1,'A2','装修','10:00','11:00',null,null,'2005-1-18','2005-1-19',2
  588. go
  589. /*--
  590. 楼主这个问题要考虑几个方面
  591. 1. 取星期时,set datefirst 的影响
  592. 2. 优先级问题
  593. 3. qid,rid 应该是未知的(动态变化的)
  594. --*/
  595. --实现的存储过程如下
  596. create proc p_qry
  597. @date smalldatetime
  598. --要查询的日期
  599. as
  600. set nocount on
  601. declare @week int,@s nvarchar(4000)
  602. --格式化日期和得到星期
  603. select @date=convert(char(10),@date,120) ,
  604. @week=(@@datefirst+datepart(weekday,@date)-1)%7 ,
  605. @s=''select id=identity(int),
  606. * into #t from
  607. (select top 100 percent qid,rid,tagname, starttime=convert(char(5),
  608. starttime,108), endtime=convert(char(5),endtime,108) from tb
  609. where (@week between startweekday and endweekday)or(@date between startdate and enddate)
  610. order by qid,rid,starttime,d desc) a
  611. select @s=@s+N',['+rtrim(rid)+N']=max(case when qid='+rtrim(qid)+N' and rid=N'''+rtrim(rid)+N''' then tagname else N'''' end)'
  612. from #t group by qid,rid
  613. exec(
  614. 'select starttime,endtime'+@s+'
  615. from #t a where not exists(
  616. select * from #t where qid=a.qid and rid=a.rid and starttime=a.starttime and endtime=a.endtime and id<a.id)
  617. group by starttime,endtime')
  618. go
  619. --调用
  620. exec p_qry'2005-1-17'
  621. exec p_qry'2005-1-18'
  622. go
  623. --删除测试
  624. drop table tb
  625. drop proc p_qry
  626. /*--
  627. 测试结果 starttime endtime A1 A2
  628. --------- ------- ---------- ----------
  629. 08:00 09:00 未订 未订
  630. 09:00 10:00 未订 未订
  631. 10:00 11:00 未订 未订
  632. starttime endtime A1 A2
  633. --------- ------- ---------- ----------
  634. 08:00 09:00 装修 未订
  635. 09:00 10:00 未订 装修
  636. 10:00 11:00 装修 未订
  637. --*/
  638.  
  639. --=======================================================================
  640.  
  641. --========================
  642.  
  643. 各种字符串合并处理示例.sql
  644.  
  645. --========================
  646.  
  647. --各种字符串分函数
  648.  
  649. 使用游标法进行字符串合并处理的示例。
  650.  
  651. --处理的数据
  652. CREATE TABLE tb(col1 varchar(10),col2 int)
  653. INSERT tb SELECT 'a',1UNION ALL
  654. SELECT 'a',2UNION ALL
  655. SELECT 'b',1UNION ALL
  656. SELECT 'b',2UNION ALL
  657. SELECT 'b',3
  658. --合并处理--定义结果集表变量
  659. DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))
  660. --定义游标并进行合并处理
  661. DECLARE tb CURSOR LOCAL FOR
  662. SELECT col1,col2 FROM tb
  663. ORDER BY col1,col2
  664. DECLARE @col1_old varchar(10),@col1 varchar(10),
  665. @col2 int,@s varchar(100)
  666. OPEN tb
  667. FETCH tb INTO @col1,@col2
  668. SELECT @col1_old=@col1,@s=''
  669. WHILE @@FETCH_STATUS=0
  670. BEGIN
  671. IF @col1=@col1_old
  672. SELECT @s=@s+','+CAST(@col2 as varchar)
  673. ELSE
  674. BEGIN
  675. INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
  676. SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
  677. END
  678. FETCH tb INTO @col1,@col2
  679. END
  680. INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
  681. CLOSE tb
  682. DEALLOCATE tb
  683. --显示结果并删除测试数据
  684. SELECT * FROM @t
  685. DROP TABLE tb
  686. /*--
  687. 结果 col1 col2
  688. ---------- -----------
  689. a 1,2 b 1,2,3
  690. --*/
  691. GO
  692. /*==============================================*/
  693.  
  694. --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例--处理的数据
  695.  
  696. CREATE TABLE tb(col1 varchar(10),col2 int)
  697. INSERT tb
  698. SELECT 'a',1UNION ALL
  699. SELECT 'a',2UNION ALL
  700. SELECT 'b',1UNION ALL
  701. SELECT 'b',2UNION ALL
  702. SELECT 'b',3
  703. GO
  704. --合并处理函数
  705. CREATE FUNCTION dbo.f_str(@col1 varchar(10))RETURNS varchar(100)
  706. AS
  707. BEGIN
  708. DECLARE @re varchar(100)
  709. SET @re=''
  710. SELECT @re=@re+','+CAST(col2 as varchar)
  711. FROM tb WHERE col1=@col1
  712. RETURN(STUFF(@re,1,1,''))
  713. END
  714. GO
  715. --调用函数
  716. SELECT col1,col2=dbo.f_str(col1)
  717. FROM tb GROUP BY col1
  718. --删除测试
  719. DROP TABLE tb
  720. DROP FUNCTION f_str
  721. /*--结果 col1 col2
  722. ---------- -----------
  723. a 1,2 b 1,2,3 --
  724. */
  725. GO
  726. /*==============================================*/
  727. --====================================================================
  728.  
  729. --3.3.3 使用临时表实现字符串合并处理的示例
  730.  
  731. --处理的数据
  732. CREATE TABLE tb(col1 varchar(10),col2 int)
  733. INSERT tb SELECT 'a',1
  734. UNION ALL SELECT 'a',2
  735. UNION ALL SELECT 'b',1
  736. UNION ALL SELECT 'b',2
  737. UNION ALL SELECT 'b',3
  738.  
  739. --合并处理
  740. SELECT col1,col2=CAST(col2 as varchar(100))
  741. INTO #t FROM tb
  742. ORDER BY col1,col2
  743. DECLARE @col1 varchar(10),@col2 varchar(100)
  744. UPDATE #t
  745. SET @col2=CASE
  746. WHEN @col1=col1
  747. THEN @col2+','+col2
  748. ELSE col2
  749. END,
  750. @col1=col1,
  751. col2=@col2
  752. SELECT * FROM #t
  753. /*--更新处理后的临时表
  754. col1 col2
  755. ---------- -------------
  756. a 1
  757. a 1,2
  758. b 1
  759. b 1,2
  760. b 1,2,3
  761. --*/
  762. --得到最终结果
  763. SELECT col1,col2=MAX(col2)FROM #t GROUP BY col1
  764. /*--结果
  765. col1 col2
  766. ---------- -----------
  767. a 1,2
  768. b 1,2,3
  769. --*/
  770. --删除测试
  771. DROP TABLE tb,#t
  772. GO
  773.  
  774. /*==============================================*/
  775. --===============================================================
  776.  
  777. --3.3.4.1 每组 <=2 条记录的合并
  778.  
  779. --处理的数据
  780. CREATE TABLE tb(col1 varchar(10),col2 int)
  781. INSERT tb SELECT 'a',1
  782. UNION ALL SELECT 'a',2
  783. UNION ALL SELECT 'b',1
  784. UNION ALL SELECT 'b',2
  785. UNION ALL SELECT 'c',3
  786.  
  787. --合并处理
  788. SELECT col1,
  789. col2=CAST(MIN(col2)as varchar)
  790. +CASE
  791. WHEN COUNT(*)=1 THEN ''
  792. ELSE ','+CAST(MAX(col2)as varchar)
  793. END
  794. FROM tb
  795. GROUP BY col1
  796. DROP TABLE tb
  797. /*--结果
  798. col1 col2
  799. ---------- ----------
  800. a 1,2
  801. b 1,2
  802. c 3
  803. --*/
  804.  
  805. --3.3.4.2 每组 <=3 条记录的合并
  806.  
  807. --处理的数据
  808. CREATE TABLE tb(col1 varchar(10),col2 int)
  809. INSERT tb SELECT 'a',1
  810. UNION ALL SELECT 'a',2
  811. UNION ALL SELECT 'b',1
  812. UNION ALL SELECT 'b',2
  813. UNION ALL SELECT 'b',3
  814. UNION ALL SELECT 'c',3
  815. --QQ291911320
  816. --合并处理
  817. SELECT col1,
  818. col2=CAST(MIN(col2)as varchar)
  819. +CASE
  820. WHEN COUNT(*)=3 THEN ','
  821. +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2)))as varchar)
  822. ELSE ''
  823. END
  824. +CASE
  825. WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2)as varchar)
  826. ELSE ''
  827. END
  828. FROM tb a
  829. GROUP BY col1
  830. DROP TABLE tb
  831. /*--结果
  832. col1 col2
  833. ---------- ------------
  834. a 1,2
  835. b 1,2,3
  836. c 3
  837. --*/
  838. GO
  839.  



1、判断实体表是否存在的方法:


1)、方法一:


if Exists(select top 1 * from sysObjects where Id=OBJECT_ID(N'UserInfos') and xtype='U')
print '表UserInfos 存在'
else
print '表UserInfos 不存在'

2)、方法二:


if OBJECT_ID(N'UserInfos',N'U') is not null
print '表UserInfos 存在!'
else
print '表UserInfos 不存在!'



2、判断临时表是否存在的方法:


1)、方法一:


if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#TempUsers') and type='U')
print '临时表#TempUsers 存在!'
else
print '临时表#TempUsers 不存在!'

2)、方法二:


if OBJECT_ID(N'tempdb..#TempUsers',N'U') is not null
print '临时表#TempUsers 存在!'
else
print '临时表#TempUsers 不存在!'


转自 https://www.cnblogs.com/luowei010101/archive/2011/05/27/2060327.html

SQL Server 2008语句大全完整版的更多相关文章

  1. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  2. 常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》

    常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML ...

  3. SQL SERVER 2008函数大全(含例子)

    --SQL SERVER 2008 函数大全 /* author:TracyLee csdncount:Travylee */ /* 一.字符串函数: 1.ascii(字符串表达式)    返回字符串 ...

  4. sql server 2008语句中的go有什么用?

    GO表示一个批处理的结束, SQLSERVER遇到Go以后就会将GO之前的语句作为一整批进行处理你在SSMS里执行的时候, 通常加不加都可以,但是如果实在SQLCMD下执行, GO就是一个执行命令了另 ...

  5. Powerdesigner逆向工程从sql server数据库生成pdm (完整版)

    第一步:打开"控制面板"中的"管理工具" 第二步:点击"管理工具"然后双击"数据源(odbc)" 第三步:打开之后,点击 ...

  6. SQL Server 2008 R2 安装 下载

    [参考]https://www.aiweibk.com/6697.html winrm 服务未启动,需要先配置.以管理员身份启动 cmd,执行 winrm quickconfig 命令. 微信截图_2 ...

  7. SQL SERVER 2008自动发送邮件(完整版)

    这两天都在搞这个东西,从开始的一点不懂,到现在自己可以独立的完成这个功能!在这个过程中,CSDN的好多牛人都给了我很大的帮助,在此表示十二分的感谢!写这篇文章,一是为了巩固一下,二嘛我也很希望我写的这 ...

  8. SQL Server 2008连接字符串写法大全

    一..NET Framework Data Provider for SQL Server 类型:.NET Framework类库使用:System.Data.SqlClient.SqlConnect ...

  9. SQL Server 2008 r2 中 SQL语句提示“对象名无效”,但可执行

    [问题描述]在使用 SQL Server 2008 r2 时,有时在完成SQL书写后,会提示“对象名无效”,而SQL语句可正常执行. [原因]缓存相关. [解决方法]ctrl+shift+R 刷新下, ...

  10. SQL Server 2008连接字符串写法大全{转}

    一..NET Framework Data Provider for SQL Server 类型:.NET Framework类库使用:System.Data.SqlClient.SqlConnect ...

随机推荐

  1. 把.netcore console 安装到Windows 系统服务。

    用个工具:NSSM 下载:最新的那个pre版本 http://www.nssm.cc/download 测试.netcore 的一个控制台程序(Console),仅仅用来定时写入一些日志, 代码如下: ...

  2. w3cschool-Spring Cloud

    https://www.w3cschool.cn/spring_cloud/spring_cloud-ryjs2ixg.html Spring Cloud(一)服务的注册与发现(Eureka) 202 ...

  3. w3cschool-Groovy 教程

    Groovy的特点 Groovy中有以下特点: 同时支持静态和动态类型. 支持运算符重载. 本地语法列表和关联数组. 对正则表达式的本地支持. 各种标记语言,如XML和HTML原生支持. Groovy ...

  4. excel表格粘贴到网页的功能

    背景 项目有表格功能,表格过大,一个一个填,过于麻烦. 需要从excel表复制的功能. 过程 监听paste事件,根据事件提供的clipboardData属性,获取数据. 根据换行符 \n 和tab符 ...

  5. Linux下mysql的二进制安装与部分练习

    鲸英训练营 0531作业 一.单选题(每题5分,总分25分) 1. 在MySQL中,一般使用( A )语句来指定一个已有数据库作为当前工作数据库. A.USED B.USE C.BEGIN D.GO ...

  6. Q:linux上某个磁盘挂载不上

    想把新创建的 /dev/datavg/data_lv 挂载到 /mysql 目录上 mkfs -t xfs -f /dev/datavg/data_lv mount /dev/datavg/data_ ...

  7. 同事PPT又拿奖了?偷偷用这AI工具,3步做出老板狂赞的年度报告

    大家好,我是六哥,今天为大家分享一款PPT辅助神器,年底汇报必备神器!就是Napkin AI ! 这是一款超级酷的工具,它能把你写的文字一秒钟转化为各种炫酷的视觉效果,比如图表.流程图.信息图啥的.如 ...

  8. 基于stm32+esp8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统

    基于STM32+ESP8266通过阿里云物联网平台和MQTT实现智慧粮仓环境监测管理系统 技术要点:STM32f407.ESP8266.阿里云物联网平台IOT.MQTT.JSON数据解析. 1.功能与 ...

  9. 简单编写Makefile与使用make工具

    简单编写Makefile与使用make工具 在不使用make工具下对c文件的编译 gcc main.c -o out gcc <目标文件> -o <生成执行文件> 编译到执行文 ...

  10. OpenLayers 绘制带箭头的LineString

    <!--******************************************************************** * Copyright 2000 - 2022 ...