SQL常用命令
/*得到32位随机UUID
*/
declare @newid varchar(36)
set @newid=newid()
select @newid
select SUBSTRING(@newid,1,8)+SUBSTRING(@newid,10,4)+SUBSTRING(@newid,15,4)+ SUBSTRING(@newid,20,4)+SUBSTRING(@newid,25,12)
select dbo.F_GetUUID() --得到32位随机函数
/*初始自增ID*/
declare @MaxID bigint
select @MaxID=isnull(max(ID),0) from d_saver
dbcc checkident(d_saver,reseed,@MaxID)
/*自动增长列插入数据*/
SET IDENTITY_INSERT d_saver ON --允许将显式值插入表的标识列中
insert into d_saver (ID,UUID,Code) values(6,'ff','ff')
SET IDENTITY_INSERT d_saver OFF --不允许将显式值插入表的标识列中
/*在以下情况是不行的:
1、要保留标识的情况下不能用 TRUNCATE TABLE,因为 TRUNCATE TABLE 会重置标识。
2、需要使用触发器的情况下不能使用 TRUNCATE TABLE ,它不会激发触发器。
3、对于由 FOREIGN KEY 约束引用的表(即主键所在的表,不是外键所在的表)不能使用 TRUNCATE TABLE。
4、对于参与了索引视图的表不能使用 TRUNCATE TABLE ,注意指索引视图,并非普通视图。
*/
truncate table d_saver --删除表中的所有行,而不记录单个行删除操作。
/*
1.在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完整模式,一定必务要再改回完整模式,不然数据库就不支持时间点备份了。
1).选择数据库–属性—选项—恢复模式–选择简单。
2).收缩数据库后,再调回完整。
2.可以用命令直接操作
JY_NEW_1710 数据库名称
*/
USE [master]
GO
ALTER DATABASE [JY_NEW_1710] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [JY_NEW_1710] SET RECOVERY SIMPLE --简单模式
GO
USE [JY_NEW_1710]
GO
declare @Name varchar(50)
select top 1 @Name=rtrim(name) from dbo.sysfiles where fileid=2 --查询出日志文件名称
DBCC SHRINKFILE (@Name, 2, TRUNCATEONLY) --设置压缩后的日志大小为2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE [JY_NEW_1710] SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE [JY_NEW_1710] SET RECOVERY FULL --还原为完全模式
USE [JY_NEW_1710]
表结构查询
select * from sysobjects where xtype='U' --查找用户表
select * from sysobjects where xtype='V' and category=0 --查找用户视图
select * from sysobjects where xtype!='U' --查找用户表
select * from syscolumns where id=1550628567
sql2005版本后
sysproperties表 升级成了sys.extended_properties
日期时间
今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0
昨天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=1
7天内的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=7
30天内的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())<=30
本月的所有数据:select * from 表名 where DateDiff(mm,datetime类型字段,getdate())=0
本年的所有数据:select * from 表名 where DateDiff(yy,datetime类型字段,getdate())=0
查询今天是今年的第几天: select datepart(dayofyear,getDate())
查询今天是本月的第几天:1. select datepart(dd, getDate())
2.select day(getDate())
查询本周的星期一日期是多少 (注意:指定日期不能是周日,如果是周日会计算到下周一去。所以如果是周日要减一天) SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)
查询昨天日期:select convert(char,dateadd(DD,-1,getdate()),111) //111是样式号,(100-114)
查询本月第一天日期:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) as firstday
查询本月最后一天日期:Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) as lastday //修改-3的值会有相应的变化
本月有多少天:select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast((cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' ) as datetime ))))
求两个时间段相差几天:select datediff(day,'2012/8/1','2012/8/20') as daysum
在指定的日期上±N天:select convert(char,dateadd(dd,1,'2012/8/20'),111) as riqi //输出2012/8/21
在指定的日期上±N分钟:select dateadd(mi,-15,getdate()) //查询当前时间15分钟之前的日期
-----------收缩数据库日志文件的三步------------
--------第一步:数据库 恢复模式 改为:简单
USE [master]
GO
ALTER DATABASE [JY_TLGL_CS] SET RECOVERY SIMPLE WITH NO_WAIT
GO
---------第二步:日志文件收缩到10M
USE [JY_TLGL_CS]
GO
DBCC SHRINKFILE (N'JY_TLGL_202010_log' , 10)
GO
--------第一步:数据库 恢复模式 改为:完整
USE [master]
GO
ALTER DATABASE [JY_TLGL_CS] SET RECOVERY FULL WITH NO_WAIT
GO
----------触发器中,错误:最大层数为32,处理----
下面的语句在指定的数据库上防止叠代触发器:
sp_dboption 库名,'recursive triggers','false'
为了在所有数据库中防止嵌套触发器调用(包括叠代调用),可以使用下面的语句:
sp_configure 'nested triggers',0