• 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)

  • 相关阅读:
    oracle锁---原理篇
    SML + NL + HJ
    Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
    oracle 一致读原理
    commit 流程
    IMPDP NETWORK_LINK参数
    WINDOWS访问虚拟机RedHat搭配的Apache2服务器
    初识malloc函数
    好吧,又失眠
    休息一天
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/1680700.html
Copyright © 2020-2023  润新知