前言:注册博客园已经有几年了,但平时都是看别人的博文,总想也自己写点什么,又怕文笔上不了台面,今天算是第一次尝试写,希望大家见谅
这里我整理了一些平时工作中比较常用的sql脚本,有些也是参照别人的一些经验
一、常用的sql分页
1.两种常用的 sql分页的存储过程
CREATE PROC GetProductByPager(
@PageIndex INT,
@PageSize INT
)
AS
SELECT TOP @PageSize * FROM Product
WHERE ProductID NOT IN(SELECT TOP @PageSize*(@PageIndex-1) ProductID FROM Product ORDER BY ProductID DESC) ORDER BY ProductID DESC
SELECT TOP @PageSize * FROM Product
WHERE ProductID >( SELECT ISNULL(max(ProductID),'') FROM ( SELECT TOP @PageSize*(@PageIndex-1) FROM Product ORDER BY ProductID) AS A)
ORDER BY ProductID
2.将表作为参数进行分页的存储过程(性能比上面两个要高一点)
CREATE PROC sp_PageList2005
@TableName varchar(100), -- 表名
@GetFields varchar(4000) = '*', -- 字段名(全部字段为*)
@OrderField varchar(3000), -- 排序字段(必须!支持多字段)
@WhereCondition varchar(5000) = Null, -- 条件语句(不用加where)
@PageIndex int = 1 , -- 指定当前为第几页
@PageSize int = 20, -- 每页多少条记录
@GroupBy varchar(200),--分组语句(不用加Group by)
@RecordCount int = 0 output --返回总记录条数
as
begin
declare @PageCount int -- 返回总页数
set @PageCount = 0
Begin Tran --开始事务
Declare @sql nvarchar(4000);
--计算总记录数
if(@GroupBy ='' or @GroupBy is null)--无GroupBy的情况
begin
set @sql = 'select @RecordCount = count(*) from ' + @TableName
if (@WhereCondition<>'' and @WhereCondition is not NULL)
set @sql = @sql + ' where ' + @WhereCondition
end
else--有GroupBy的情况
begin
set @sql = 'select @Recordcount=count(*) from(select 1 as total from ' + @TableName
if (@WhereCondition<>'' and @WhereCondition is not NULL)
set @sql = @sql + ' where ' + @WhereCondition
set @sql = @sql + ' group by ' + @GroupBy
set @sql = @sql + ') as t'
end
EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总记录数
select @PageCount=CEILING((@RecordCount+0.0)/@PageSize) --计算总页数
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @GetFields + ' from ' + @TableName
if (@WhereCondition<>'' and @WhereCondition is not NULL)
set @sql = @sql + ' where ' + @WhereCondition
if(@GroupBy <>'' and @GroupBy is not null)
set @sql = @sql + ' group by ' + @GroupBy
--处理页数超出范围情况
if @PageIndex<=0
Set @PageIndex = 1
if @PageIndex>@PageCount
Set @PageIndex = @PageCount
--处理开始点和结束点
Declare @StartRecord int
Declare @EndRecord int
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1
--继续合成sql语句
set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @RecordCount ---返回记录总数
End
end
二、常用的SQL命令脚本
1.(删除所有表的外键约束):
DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; ' from sysobjects where xtype = 'F' open c1 declare @c1 varchar(8000) fetch next from c1 into @c1 while(@@fetch_status=0) begin exec(@c1) fetch next from c1 into @c1 end close c1 deallocate c1
2.(删除所有表):
use 数据库名(是要删除表的所在的那个数据库的名称) GO declare @sql varchar(8000) while (select count(*) from sysobjects where type='U')>0 begin SELECT @sql='drop table ' + name FROM sysobjects WHERE (type = 'U') ORDER BY 'drop table ' + name exec(@sql) end
3.(删除所有存储过程):
use 数据库名(是要删除表的所在的那个数据库的名称) GO declare @sql varchar(8000) while (select count(*) from sysobjects where type='P')>0 begin SELECT @sql='drop Procedure ' + name FROM sysobjects WHERE (type = 'P') ORDER BY 'drop Procedure ' + name exec(@sql) end
4.将数据库A中的表的数据导入到数据库B中的某一张表
insert into HelpStore.dbo.IPDataTable(StartIP,EndIP,Country) ( select StartIP,EndIP,Country from IPData.dbo.IPDataTable )
5.修改某个表的字段的长度
alter table Products_SellsTemp alter column ClassPath varchar(150)
6.按季度统计(这个比较常用哦,也很经典)
SELECT Y, SUM(Q1) AS Q1,SUM(Q2) AS Q2,SUM(Q3)AS Q3,SUM(Q4) AS Q4 FROM ( SELECT year(FirstTime) AS Y, (cASe when month(FirstTime) >= '01' AND month(FirstTime) <= '03' then COUNT(SellerID) else 0 end ) AS Q1, (cASe when month(FirstTime) >= '04' AND month(FirstTime) <= '06' then COUNT(SellerID) else 0 end ) AS Q2, (cASe when month(FirstTime) >= '07' AND month(FirstTime) <= '09' then COUNT(SellerID) else 0 end ) AS Q3, (cASe when month(FirstTime) >= '10' AND month(FirstTime) <= '12' then COUNT(SellerID) else 0 end ) AS Q4 from Msg_Box WHERE 1=1 AND FirstTime IS NOT NULL group by year(FirstTime),month(FirstTime) ) AS Tbl GROUP BY Tbl.Y
三、数据库日志操作
1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。
清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志: dump transaction with truncate_only dump transaction with no_log 通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。 以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。 清除后对数据库没有影响
SELECT * FROM sysobjects WHERE (xtype = 'U')
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程