工作中常用的数据库操作脚本整理

前言:注册博客园已经有几年了,但平时都是看别人的博文,总想也自己写点什么,又怕文笔上不了台面,今天算是第一次尝试写,希望大家见谅

这里我整理了一些平时工作中比较常用的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 count(1) from sysobjects where xtype='U' 视图数量: select count(1) from sysobjects where xtype='V' 存储过程数 select count(1) from sysobjects where xtype='P'

 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 = 扩展存储过程

 

 

 

原文地址:https://www.cnblogs.com/johnwood/p/3447006.html