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


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

    这里我整理了一些平时工作中比较常用的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 = 扩展存储过程

     

     

     

  • 相关阅读:
    FPGA时序约束的几种方法
    使用NiosII代替SignalTap来监测FPGA内部数据
    Modelsim的使用
    Modelsim+Debussy
    ChipScope用法总结
    QuartusII增量编译的个人学习
    quartus II .qsf文件(zz)
    RAM与Nand/Nor flash之间的区别 (转)
    黑金资料AX301_A的Quartus工程建立、编译及引脚分配、程序下载
    关于sg90舵机的,要知道!要注意!
  • 原文地址:https://www.cnblogs.com/johnwood/p/3447006.html
Copyright © 2020-2023  润新知