zoukankan      html  css  js  c++  java
  • T_SQL 开发的13个Tips

    1 类型转换  Cast(10.947 AS INT) 或Convert(INT,10.947)

    2  经常用到的函数
    newid() 用于创建GUID值,round(price,2) 四舍五入
    isnull(summary,0) 如果summary为空,则返回0
    substring(‘abcdefg’,2,3)  取子字符串
    replace(‘abcdefg’,’abc’,’123’) 替换字符串
    rand() 求0-1之间的随机数  
    dateAdd(day, 21, getdate()) 在向指定日期加上一段时间的基础上,返回新的 datetime 值
    datePart(month, GETDATE())  返回代表指定日期的指定日期部分的整数

    3 动态构建SQL
    exec (‘  SELECT [job_id], [job_desc] FROM [pubs].[dbo].[jobs] ‘)
    或 exec sp_executesql N’SELECT [job_id], [job_desc] FROM [pubs].[dbo].[jobs]’
    字段名,表名,数据库名作变量时,必须用动态SQL
    declare @fname varchar(20)
    set @fname='job_id'
    exec (' SELECT '+ @fname+ ' FROM [pubs].[dbo].[jobs] ')

    4  在数据导入导出功能时,如果是SQL Server 之间相互拷贝数据,并且表的字段类型含有identity值,则应该使用下面的脚本关闭自增,导入导出完毕后再打开
    set identity_insert  表名  on   --关闭表的identity属性作用
    set identity_insert   表名  off   --打开表的identity属性作用

    5  CASE语句的写法
    SELECT  Price=CASE WHEN  Price  IS NULL THEN ‘not yeat’
                                   WHEN  Price<10 THEN ‘Cheap’
                                    WHEN Price>10 THEN ‘Expensive’
                             END
    或是把需要比较的列值放到when的后面。
    SELECT Gender=
      CASE 1 THEN ‘男’
      CASE 0  THEN ‘女’ 
      ELSE ‘not yet’
    END
    CASE 语句常用于行列转换
    SELECT 部门,
    [材料1]= SUM(CASE 材料 WHEN ‘材料1’ THEN 数量 ELSE 0 END) ,
    [材料2]= SUM(CASE 材料 WHEN ‘材料2’ THEN 数量 ELSE 0 END)
    FROM 部门耗材
    GROUP BY 部门

    6 分页 查询第X页,每页Y条记录
    如果表中有主键
    select top y * from 表 where 主键 not in(select top (x-1)*y 主键 from 表)
    如果表中无主键,可以用临时表,加标识字段解决
    select id=identity(int,1,1),*  into #tb from 表
    select * from #tb where id between (x-1)*y and x*y-1

    7 EXISTS的用法
    SELECT DISTINCT pub_name   FROM publishers
    WHERE EXISTS
       (SELECT *    FROM titles    WHERE pub_id = publishers.pub_id    AND type = 'business')

    8  流水号生成
    生成长度为8的编号,编号以BH开头,其余6位为流水号
    CREATE FUNCTION f_NextBH()
    RETURNS char(8)
    AS
    BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
    END
    GO
    --在表中应用函数
    CREATE TABLE tb(
    BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
    col int)

    生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号
    --创建得到当前日期的视图
    CREATE VIEW v_GetDate  AS
    SELECT dt=CONVERT(CHAR(6),GETDATE(),12) GO
    --得到新编号的函数
    CREATE FUNCTION f_NextBH()
    RETURNS char(12)
    AS
    BEGIN
        DECLARE @dt CHAR(6)
        SELECT @dt=dt FROM v_GetDate
        RETURN(
            SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)
            FROM tb WITH(XLOCK,PAGLOCK)
            WHERE BH like @dt+'%')
    END
    GO

     --在表中应用函数
    CREATE TABLE tb(
    BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
    col int)

    9  选择不重复的字符串,表的数据如下,假设列名为ID,表名为tbl
    aaa
    bbb
    ccc
    aaa
    1)   DISTINCT  SELECT DISTINCT ID FROM tbl
    2)   分组 SELECT  ID FROM tbl GROUP BY ID Having COUNT(*)>1 


    10 字符串用在where语句中判断是否相等的时候,提示cannot resolve collection conflict for equal to operation,
    应该加上database default

    11 SQL Server 字符串类型是大小写不敏感的,aa,AA是同样的含义。
    有时候确需要实现大小写字符敏感,比如密码。aa,AA表示不同的密码。
    为实现字符串大小写敏感,可以把字符串转话为二进制后再作比较。
    CAST(Password AS varbinary)

    12 SQL 错误处理
    检测@@error变量的值,发生错误时,该值不为0
    if @@error<>0
        print '发生错误1'
    不是严重的错误,所以SQL会执行下去;
    属于严重的错误,所以SQL没有执行下去;
    被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去;
    SQL Server 2005的用法
    BEGIN TRY
    DELETE FROM IPR WHERE TransationID= 1003
    END TRY
    BEGIN CATCH
    END CATCH

    13  子查询
    求工资最高的员工的姓名
    SELECT name FROM Employee
      WHERE wage=(SELECT MAX(wage) FROM Employee)
    求评论最多的文章
    SELECT Title FROM Post
      WHERE Reply=(SELECT MAX(Reply) FROM Post)

  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/1680700.html
Copyright © 2011-2022 走看看