MSSQL之十一 数据库高级编程总结(上)

简介: MSSQL之十一 数据库高级编程总结(上)

视频课https://edu.csdn.net/course/play/7940


一.  SQL Server数据库命名规范



数据库命名规范:


1. 数据库名:


      1.1)用产品或项目的名字命名;


      1.2)Pascal Case,如AdventureWork;


      1.3)避免使用特殊字符,如数字,下划线,空格之类;


      1.4)避免使用缩写



2. 表名


      2.1)使用复数,Pascal Case,而复数只加在最后一个单词上如:Products,Users,UserRoles


      2.2)避免使用特殊字符,如数字,下划线,空格之类;


      2.3)避免使用缩写



3. 列名


      3.1) 使用Pascal Case


      3.2) 避免和表名重复,避免数据类型前缀如: Int


      3.3) 避免使用缩写或者特殊字符



4. 存储过程


      4.1)用动词加表名描述操作类型


      4.2)使用前缀:sp+{“Insert”, “Update”, “Delete”,“Get”, “Validate”,...}



5.  视图


          5.1)参考表名规则


          5.2)用"vw"做前缀



6. 触发器


          6.1)使用"trg"前缀


          6.2) 使用操作类型+表名,如:trg_ProductsInsert



7. 索引


          7.1)使用格式如:idx_{表名}_{索引列名}_{Unique/NonUnique}_{Cluster/NonCluster}



8. 主键


        8.1) 使用格式如:pk_{表名}_{主键列名}



9. 外键


        9.1) 使用格式如:fk_{主表名}_{主表的列名}_{引用表名}_{引用表的列名}



10. default


    10.1) 使用格式如:df_{表名}_{列名}



11. 约束


    11.1) 使用格式如:ck_{表名}_{列名}



12. 变量


    12.1) 参照列名规则



二. 数据库备份



备份处理的存储过程  


set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go


 /*--备份所有数据库  

 

 备份的文件名为数据库名+日期+.bak  

 将所有的用户数据库(或指定的数据库列表)  

 备分到指定的目录下.  

 

 /*--调用示例  

 

 --备份所有用户数据库  

 exec   p_backupdb  @bkpath='D:\',@dbname=''  

 

 --备份指定数据库  

 exec   p_backupdb   @bkpath=D:\',@dbname='数据库名称'  

 --*/  

 

create  proc   [dbo].[p_backupdb]  

 @bkpath   nvarchar(260)='D:\', --备份文件的存放目录,不指定则使用SQL默认的备份目录  

@dbname   nvarchar(4000)='' --要备份的数据库名称列表,不指定则备份所有用户数据库  

as

declare   @sql   varchar(8000)

DECLARE @strdate NVARCHAR(200)

set @strdate = convert(NVARCHAR(10),getdate(),120)

set @strdate = REPLACE(@strdate, '-' , '')

 

 --检查参数  

 if   isnull(@bkpath,'')=''  

 begin  

 select   @bkpath=rtrim(reverse(filename))  from   master..sysfiles   where  name='master'  

 select  @bkpath=substring(@bkpath,charindex('\',@bkpath)+1,4000)  

,@bkpath=reverse(substring(@bkpath,charindex('\',@bkpath),4000))+'BACKUP\'  

 end  

 else   if   right(@bkpath,1)<>'\'  set   @bkpath=@bkpath+'\'  

 

 --得到要备份的数据库列表  

 if   isnull(@dbname,'')=''  

 declare   tb   cursor   local  for  

 select   name   from  master..sysdatabases   where   name  not   in('master','tempdb','model','msdb')  

 else  

 declare   tb   cursor   local  for  

 select   name   from  master..sysdatabases  

 where   name   not  in('master','tempdb','model','msdb')  and(name  like '%'+@dbname+'%')

 

 --备份处理  

 open   tb  

 fetch   next   from   tb  into   @dbname  

 while   @@fetch_status=0  

 begin  

 set   @sql='backup   database  '+@dbname  

 +'   to   disk='''+@bkpath+@dbname+'_'+@strdate

 +'.bak''   with   format'  

 exec(@sql)  

 fetch   next   from   tb  into   @dbname  

 end  

 close   tb  

 deallocate   tb  

 go



二.      Sql Server 2005的分页存储过程



CREATEPROCEDURE     [dbo].[TopPageList]

   @strTable      varchar(200),   --表名 ("@strTable", "myUser");

   @strColumn     varchar(50),    --按该列来进行分页("@strColumn", "UserId");

   @strOrderColumn  varchar(50),    --排序字段order by XXX desc

   @intOrder     int,--排序的顺序 0 升序 1降序

   @strColumnlist  varchar(150) , --要查询出的字段列表,*表示全部字段 cmd.Parameters.Add("@strColumnlist", "*");  

   @strWhere      varchar(800)='',--查询条件cmd.Parameters.Add("@strWhere", "");

   @intPageSize    int, --每页记录数  cmd.Parameters.Add("@intPageSize", 15);

   @intPageNum    int,           --指定页  cmd.Parameters.Add("@intPageNum", 5);

 --  @intPageCount   int   OUTPUT  , --总页数  SqlParameter paramPageCount =cmd.Parameters.Add("@intPageCount", SqlDbType.Int);

  -- paramPageCount.Direction = ParameterDirection.Output;

   @itemCount      int  OUTPUT

--   @doCount bit = 0, -- 返回, 非值则返回记录总数

 AS

--设置相应的空格

--设置DESC ASC

 if @intOrder=0  --0升序

    set @strOrderColumn=' order by '+@strOrderColumn

 else           --降序

    set @strOrderColumn=' order by '+@strOrderColumn +' desc '

 DECLARE   @sql    nvarchar(2000) --用于构造SQL语句

 DECLARE   @where1 varchar(800)   --构造条件语句

 DECLARE   @where2 varchar(800)   --构造条件语句

 IF   @strWhere   is   null  or   rtrim(@strWhere)=''  

 -- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格

 BEGIN  --没有查询条件

     SET   @where1=' WHERE '  

     SET   @where2=' '  

 END  

 ELSE  

 BEGIN  --有查询条件

     SET   @where1=' WHERE  ('+@strWhere+')  AND '

     SET   @where2=' WHERE  ('+@strWhere+') '  

 END

 ------构造SQL语句,计算总页数。计算公式为总页数= Ceiling ( 记录个数/ 页大小)

  --计算总项数

 SET   @sql='SELECT   @itemCount=COUNT('+@strColumn+') from  '+@strTable +@where2

print(@sql)

 EXEC sp_executesql  @sql,N'@itemCount  int  OUTPUT',@itemCount   OUTPUT

  --   1:直接计算    2:自己写个分页控件里面设置一下也可以~!

-- set @intPageCount  =floor(cast(@itemCount as float)/@intPageSize)

 --   if @intPageCount

 --   set @intPageCount =@intPageCount +1

--

 

 --执行SQL语句,计算总页数,并将其放入@intPageCount变量中

 --将总页数放到查询返回记录集的第一个字段前,此语句可省略

 SET  @strColumnlist=' '+ Cast(@itemCount as varchar(30)) + ' asitemCount,' +' '+ @strColumnlist  

--+ Cast(@intPageCount as varchar(30)) + ' as PageCount,'

 SET @sql='SELECT TOP '+ CAST(@intPageSize   AS  varchar)  +  @strColumnlist +  

              ' FROM ' + @strTable + @where1 + '  '+

              @strColumn + ' not in  '+  

              '  (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1)  AS varchar) + ' ' +

              @strColumn + ' FROM '+ @strTable+@where2+@strOrderColumn+')  ' +@strOrderColumn

 print(@sql)

--ELSE

--     begin   --构造降序的SQL---针对2个表的时候会出现聚合函数的异常--适合单个表格的数据库分页操作

--     SET @sql='SELECT TOP '+CAST(@intPageSize   AS   varchar)  + @strColumnlist +  

--              ' FROM ' + @strTable + @where1 + '  '+

--             @strColumn + '<(SELECT MIN('+@strColumn+') '+  

--             ' FROM (SELECT TOP '+ CAST(@intPageSize*(@intPageNum - 1)  AS varchar) + ' ' +

--             @strColumn + ' FROM '+ @strTable+@where2+@strOrderColumn+')  as tblTmp)' +@strOrderColumn

 --    print(@sql)

--     end

 IF   @intPageNum=1--第一页

     SET   @sql='SELECT  TOP   '+CAST(@intPageSize   AS   varchar) +@strColumnlist + ' FROM'+@strTable+  

               @where2+@strOrderColumn

 --END  

--PRINT   @sql  

print(@sql)

exec(@sql)



public static void BindingContent(string strTable, string strColumn, stringstrOrderColumn, int intOrder, string strColumnlist, string strWhere,IChangePageStored changePage)
        {
           SqlParameter[] paras=new SqlParameter[9];
            paras[0] =new SqlParameter("@strTable" ,SqlDbType.VarChar);
           paras[0].Value = strTable;
            paras[1] =new SqlParameter("@strColumn", SqlDbType.VarChar);
           paras[1].Value = strColumn;
            paras[2] =new SqlParameter("@strOrderColumn", SqlDbType.VarChar);
           paras[2].Value = strOrderColumn;
            paras[3] =new SqlParameter("@strColumnlist", SqlDbType.VarChar);
           paras[3].Value = strColumnlist;
            paras[4] =new SqlParameter("@intOrder", SqlDbType.Int);
           paras[4].Value = intOrder;
            paras[5] =new SqlParameter("@strWhere", SqlDbType.VarChar);
           paras[5].Value = strWhere;
            paras[6] =new SqlParameter("@intPageSize", SqlDbType.Int);
           paras[6].Value = changePage.PageSize;
            paras[7] =new SqlParameter("@intPageNum", SqlDbType.Int);
           paras[7].Value = changePage.CurrentPage  ;
         //   paras[8] = newSqlParameter("@intPageCount", SqlDbType.Int);
         //  paras[8].Direction = ParameterDirection.Output;
            paras[8] =new SqlParameter("@itemCount", SqlDbType.Int);
           paras[8].Direction = ParameterDirection.Output;
            DataSet ds =DBTool.ExecuteDataset(CommandType.StoredProcedure, "TopPageList",paras);
          /* @intPageCount   int   OUTPUT  , --总页数  SqlParameterparamPageCount = cmd.Parameters.Add("@intPageCount", SqlDbType.Int);
   -- paramPageCount.Direction = ParameterDirection.Output;
               @strTable = N'zhq_in_content c  INNER JOIN zhp_in_columns  m ONc.columns_id=m.columns_id',
  @strColumn = N'c.content_id',
  @strOrderColumn = N'c.createdate',
  @intOrder = 1,
  @strColumnlist = N'*',
  @strWhere = N'c.status=0 AND c.del=0',
  @intPageSize = 20,
  @intPageNum =100,*/
           changePage.DataSource = ds.Tables[0].DefaultView;// 设置分页控件的数据
            if (ds !=null && ds.Tables[0].Rows.Count > 0)
            {
               changePage.RecordCount =int.Parse(ds.Tables[0].Rows[0]["itemCount"].ToString());
              // changePage.PageCount =int.Parse(ds.Tables[0].Rows[0]["PageCount"].ToString());
            }
            if(changePage.DataUI.GetType().BaseType.Name == "BaseDataList")
            {
               changePage.DataUI.DataSource = changePage.DataSource;//设置数据源控件的数据
               changePage.DataUI.DataBind();
            }
       }


目录
相关文章
|
10天前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
2月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
41 1
|
5月前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
4月前
|
存储 数据库 Python
python的对象数据库ZODB的使用(python3经典编程案例)
该文章介绍了如何使用Python的对象数据库ZODB来进行数据存储,包括ZODB的基本操作如创建数据库、存储和检索对象等,并提供了示例代码。
58 0
|
4月前
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
187 0
|
5月前
|
Linux 数据库 数据安全/隐私保护
|
4月前
|
SQL 存储 数据库
MSSQL遍历数据库根据列值查询数据
【9月更文挑战第12天】在 SQL Server 中,可以通过游标或临时表遍历数据库并根据列值查询数据。示例展示了如何创建临时表存储数据库名,并通过循环遍历这些名称来执行特定查询。需替换 `YourTableName`、`YourColumnName` 和 `YourValue` 为实际值。此方法要求有足够权限访问各数据库。若无跨库权限,需分别执行查询。
|
5月前
|
存储 SQL 数据库
|
5月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
71 0
|
5月前
|
存储 SQL 数据库
【计算机三级数据库技术】第8章 数据库后台编程技术--附思维导图
本文介绍了数据库后台编程的关键技术,包括存储过程、用户定义函数、触发器和游标,并附有思维导图。
42 1