zoukankan      html  css  js  c++  java
  • Sql Server常用函数及技巧

    使用Sql Server好长时间了,今天特别想总结一下,算是回顾吧!

    总结: 其实很多技巧,都是基于SQL Server自带的System ViewsSystem Stored ProceduresSystem Functions (常用函数都在在里面)。

    常用函数:

    1. ISNULL(columnName, '')

      先判断该字段是否为空,如果为空,返回''; 否则返回该字段本来的值。

    2. DATEDIFF(datepart,startdate,enddate)

      不罗嗦,直接参考 链接

    3. CONVERT函数

      直接参考链接

    4. LEN  计算长度

    5. OBJECT_NAME('object_id')  通过object id得到object name

    6. OBJECT_ID('object_name')   通过object name得到 object id

    7. CAST 函数 

    实用语句:

    1. 有时候项目中定义的储存过程比较多,需要确定某一个表被哪些stored procedure使用了,可以有如下两种方法:

      a. SSMS界面上,选中要查的表,右键,点击查找依赖,就会显示出来

      b. 使用语句:   

    exec sys.sp_depends <tableName>

        例如: exec sys.sp_depends 'TB_Student'

    2. 查找 死锁

      用到系统表: sys.sysprocesses (其实是一个系统View) 

    视图中主要的字段:
    1. Spid:Sql Servr 会话ID
    2. Kpid:Windows 线程ID
    3. Blocked:正在阻塞求情的会话 ID。如果此列为 Null,则标识请求未被阻塞
    4. Waittype:当前连接的等待资源编号,标示是否等待资源,0 或 Null表示不需要等待任何资源
    5. Waittime:当前等待时间,单位为毫秒,0 表示没有等待
    6. DBID:当前正由进程使用的数据库ID
    7. UID:执行命令的用户ID
    8. Login_time:客户端进程登录到服务器的时间。
    9. Last_batch:上次执行存储过程或Execute语句的时间。对于系统进程,将存储Sql Server 的启动时间
    10.Open_tran:进程的打开事务个数。如果有嵌套事务,就会大于1
    11.Status:进程ID 状态,dormant = 正在重置回话 ; running = 回话正在运行一个或多个批处理 ; background = 回话正在运行一个后台任务 ; rollback = 会话正在处理事务回滚 ; pending = 回话正在等待工作现成变为可用 ; runnable = 会话中的任务在等待获取 Scheduler 来运行的可执行队列中 ; spinloop = 会话中的任务正在等待自旋锁变为可用 ; suspended = 会话正在等待事件完成
    12.Hostname:建立链接的客户端工作站的名称
    13.Program_name:应用程序的名称,就是 连接字符串中配的 Application Name
    14.Hostprocess:建立连接的应用程序在客户端工作站里的进程ID号
    15.Cmd:当前正在执行的命令
    16.Loginame:登录名 

      例子:

      a. 检查数据库是否发生阻塞

      先查找哪个链接的 blocked 字段不为0。如 SPID10的blocked 字段不为0,而是11。SPID 11 的 blocked 为0,就可以得出结论:此时有阻塞发生,10 被 11 阻塞住了。如果你发现一个连接的 blocked 字段的值等于它自己,那说明这个连接正在做磁盘读写,它要等自己的 I/O 做完。

      b. 查找链接在那个数据库上

      检查 dbid 即可。得到 dbid,可以运行以下查询得到数据库的名字:

    Select name,dbid from master.sys.sysdatabases
    

      

    3. 查看View或者Stored Procedure的定义语句,有时候通过SSMS界面比较慢,用语句较快

    Select definition, * from sys.sql_modules

      使用系统表(严格意义上,是个View):sys.sql_modules 

    4. 在Stored Procedure中查找关键字

      之前用下面的语句,但是发现这条语句有问题,因为这里的ROUTINE_DEFINITION,只取到procedure内容的前4000个字符,导致查的结果不正确。

    SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_DEFINITION LIKE '%keyWord%'
    AND ROUTINE_TYPE = 'PROCEDURE'
    

      用下面的语句,就可以查到:

    SELECT OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id)
    FROM SYS.PROCEDURES
    WHERE OBJECT_DEFINITION(object_id) LIKE '%keyWord%'
    

      看完上面的第3条,其实使用sys.sql_modules 也是可以用来查找关键字。

    5.  在数据库中,我们会经常看到,一些表中,只有一个id做为主键,那我们怎么快速确认它是否是自增的呢?

      使用下面的语句查询,objectId和columnName根据实际情况填写。如果id_identity的值为1,它就是自增的,否则,就不是自增的。

    select id_identity, * from sys.columns where object_id = 'objectId' and name = 'columnName'
    

      一般在建表语句中,定义自增使用的是  identity(1, 1) , 表示自增,从1开始,递增量为1。

    CREATE TABLE T_test
    (ID int IDENTITY(1,1),
    Name varchar(50)
    )

      判段一个表是否具有标识列
      可以使用 OBJECTPROPERTY 函数确定一个表是否具有 IDENTITY(标识)列,用法:

    Select OBJECTPROPERTY(OBJECT_ID('表名'),'TableHasIdentity')

      如果有,则返回1,否则返回0

      判断某列是否是标识列
      可使用 COLUMNPROPERTY 函数确定 某列是否具有IDENTITY 属性,用法

    SELECT COLUMNPROPERTY( OBJECT_ID('表名'),'列名','IsIdentity')

      如果该列为标识列,则返回1,否则返回0

      查询某表标识列的列名
      SQL Server中没有现成的函数实现此功能,实现的SQL语句如下

    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns
    WHERE TABLE_NAME='表名' AND COLUMNPROPERTY( 
    OBJECT_ID('表名'),COLUMN_NAME,'IsIdentity')=1
    

      

  • 相关阅读:
    D. Time to Run【构造】
    P3388 割顶 【求割点个数】
    处女座的测验 素数,构造
    处女座与复读机 DP
    求一个分数小数点后指定位数的数字
    安卓开发创建活动,布局,添加按钮,she使用Toast,设菜单,使菜单相关联等操作
    三进制 处女座的砝码 高精度
    上海高校程序设计联赛 D-CSL的字符串 栈模拟
    区间DP经典 石子合并
    区间DP 洛谷P2858牛奶零食
  • 原文地址:https://www.cnblogs.com/FocusIN/p/7341380.html
Copyright © 2011-2022 走看看