昨晚有空,把 sybase 系统过程 sp_who , DDL 后分析了一下,全文如下:

-- 以下是 DDL 出来的内容:

-----------------------------------------------------------------------------

-- DDL for Stored procedure 'sybsystemprocs.dbo.sp_who'

-----------------------------------------------------------------------------

-- 以上是注释

print 'Creating Stored procedure sp_who'

go

-- 上面两句是显示一句话, go 是执行(下同)

use sybsystemprocs

go

-- 选择将要使用的数据库(存储过程建在什么数据库里)

setuser 'dbo'

go

-- 使当前用户充当 'dbo

-- 以下是存储过程的实体

/* Sccsid = "%Z% generic/sproc/%M% %I% %G%" */

/* 4.8 1.1 06/14/90 sproc/src/serveroption */

/*

** Messages for "sp_who" 17nnn

**

** 17231, "No login with the specified name exists."

*/

-- 以上是注释

create procedure sp_who @loginame varchar(30) = NULL as

-- 创建存储过程 sp_who) 的参数 loginame

declare @low int

declare @high int

declare @spidlow int

declare @spidhigh int

declare @len1 int, @len2 int, @len3 int

-- 申明了若干变量

if @@trancount = 0

--@@ 开头的都是系统全局变量

--@@trancount 是用来检查事务嵌套级别的全局变量,批处理中每个 begin transaction 将事务计数加 1

begin

set chained off

-- 用在会话开始和事务结束时使用,指示是否在第一个数据检索或数据修改语句前开始一个事务(是否在 delte 、 fetch 、 insert 、 open 、 select 、 update 前隐式执行一个 begin transaction 命令)

end

set transaction isolation level 1

-- 设置会话所用的事务隔离级别。当设置此选项后,所有当前或将来的事务都将在些隔离级别上运行

--level 1 的意义:允许对数据使用共享读取锁

select @low = @@minsuid, @high = @@maxsuid,

@spidlow = @@minspid, @spidhigh = @@maxspid

-- 给局部变量赋值,四个全局变量的含义:

--@@minsuid :最小服务器用户 ID

--@@maxsuid :最大服务器用户 ID

--@@minspid :最小服务器进程 ID

--@@maxspid :最大服务器进程 ID

if @loginame is not NULL

-- 判断存储过程的参数是否为空

begin

-- 开始一个新的批

select @low = suser_id(@loginame), @high = suser_id(@loginame)

--suser_id: 系统函数,返回服务器用户在 syslogins 表中的 ID 号

if @low is NULL

-- 如果参数 @loginame 不正确的话, suser_id 应该返回 NULL

begin

if @loginame like "[0-9]%"

-- 判断一下 @loginame 是不是数字开头的字符串

begin

-- 如果是的话把说明参数 @loginame 应该是服务器系统进和 ID

select @spidlow = convert(int, @loginame),

@spidhigh = convert(int, @loginame),

@low = 0, @high = @@maxsuid

-- 把参数 @loginame 转换成 int 型并赋给 @spidlow 和 @spidhigh

end

else

-- 如果不是数据开头的字符串,返回错误代码,并返回

begin

/*

** 17231, "No login with the specified name exists."

*/

raiserror 17231

-- 返回的错误号是 17231

--raiserror 的作用是返回预定义的错误号

return (1)

end

end

end

-- 以上进行的工作是将 @loginame 进行处理,生成下面查询语言的所需的条件值 @low 、 @high 、 @spidlow 、 @spidhigh

select @len1 = max(datalength(suser_name(suid))),

@len2 = max(datalength(db_name(dbid))),

@len3 = max(datalength(suser_name(origsuid)))

from master..sysprocesses

where suid >= @low and suid <= @high and

spid >= @spidlow and spid <= @spidhigh

--suser_name() :返回当前服务器用户的名称或已指定服务器用户 ID 的用户

--db_name() :返回已指定 ID 号的数据库的名称

--suser_name() :返回当前服务用户的名称或已指定服务器用户 ID 的用户

--datalength() :返回指定列或字符串的实际长度(以字节表示)

--max() :返回表达式的最大值

-- 以上语句找出 master 库 sysprocesses 表中 suid 、 dbid 、 origsuid 三列的最大实际长度

-- 以下语句是返回结果

-- 两个 select 语句的检索列、 from 、 where 、 order 子句都是一样的,只是检索列的字符串长度不一致!(更好看些,呵呵)

-- 两个 select 语句都是从 master 库 sysprocesses 表中检索出符合条件的指定列, 红色的地方是两个 select 不一致的地方 。

if (@len1 > 8 or @len2 > 6 or @len3 > 8)

begin

select fid,

spid,

status,

loginame=suser_name(suid),

origname=isnull(suser_name(origsuid), suser_name(suid)),

hostname,

blk_spid=convert(char(5),blocked),

dbname=db_name(dbid),

cmd,

block_xloid

from master..sysprocesses

where suid >= @low and suid <= @high

and spid >= @spidlow and spid <= @spidhigh

order by fid,spid,dbname

end

else

begin

select fid,

spid,

status,

loginame= convert(char(12), suser_name(suid) ) ,

origname= convert(char(12), isnull(suser_name(origsuid), suser_name(suid)) ) ,

hostname,

blk_spid=convert(char(5),blocked),

dbname=convert(char(10),db_name(dbid)),

cmd,

block_xloid

from master..sysprocesses

where suid >= @low and suid <= @high

and spid >= @spidlow and spid <= @spidhigh

order by fid,spid,dbname

end

return (0)

-- 返回

go

Grant Execute on dbo.sp_who to public

-- 向 public 组授予执行 sp_who 的权限

go

setuser

-- 如果在执行 setuser 命令时没有指定用户名,则将重新建立数据库所有者的初始标识

go

-- 我们可以看到,该存储过程的基本思路是先对传入的参数进行处理,生成查询用的条件参数,进而得出查询结果。

-- 对于该存储过程为了最终显示效果而加入的一段代码的作法,是值得我们学习的。

分析下来,如果你执行一个 sp_who '1sgfadf'

就会发生:

Syntax error during explicit conversion of VARCHAR value '1sgfadf' to a INT field.

的错误

呵呵,都是下面这段语句惹的祸:

if @loginame like "[0-9]%"

-- 判断一下 @loginame 是不是数字开头的字符串

begin

-- 如果是的话把说明参数 @loginame 应该是服务器系统进和 ID

select @spidlow = convert(int, @loginame),

@spidhigh = convert(int, @loginame),

@low = 0, @high = @@maxsuid

-- 把参数 @loginame 转换成 int 型并赋给 @spidlow 和 @spidhigh

end

分享至:

mysql sp who_对ASE系统存储过程的剖析-sp_who相关推荐

  1. SQL Server 系统存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存在内存中,下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. ...

  2. SQL Server常用的系统存储过程应用实例(转)

    摘要:Sql Server自带的系统存储过程有许多,但大部分我们是不常用的.我在实践中根据自己的体会,总结整理了一些比较常用的,加上一些实例介绍给大家.本期介绍: l         sp_attac ...

  3. day29 | 黑马程序员Java全程笔记 | 第二阶段MySQL高级事务-索引-视图-触发器-存储过程

    目录 01.反馈 02.回顾 03.并发访问MySQL-问题概述 并发访问的问题 04.并发访问MySQL-问题演示 05.并发访问MySQL-read-committed解决脏读问题 06.并发访问 ...

  4. java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署

    java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署 java计算机毕业设计新冠疫苗接种预约系统登录源码+mysql数据库+lw文档+系统+调试部署 本源码技 ...

  5. 简述mysql的存储的优点_SQL存储过程简介及优点

    存储过程是SQL语言中的一种,在大型的数据库系统中,一系列为了达到某种特定功能的SQL语句.经过重新编译之后存储在数据库中,再通过指定的名字,并且提供参数来执行它. 一.SQL Server 存储过程 ...

  6. MySQL 学习笔记(6)— 存储过程创建、调用、删除以及带参数的存储过程

    1. 存储过程总结 存储过程是一种存储在数据库中的程序.它可以包含多个 SQL 语句,并提供许多过程语言的功能,例如变量定义.条件控制语句.循环语句.游标以及异常处理等. 1.1 存储过程优点 实现代 ...

  7. c3p0连接池配置_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统

    项目简介 项目来源于:https://gitee.com/sunnyandgood/OnlineMusic 本系统基于Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统.简单 ...

  8. mysql sp cursoropen_三个重要的游标sp_cursoropen_MySQL

    bitsCN.com 請問這三個存諸過程的作用是什么﹖ sp_cursoropen, sp_cursorfetch, sp_cursorclose API 服务器游标实现 SQL Server OLE ...

  9. SQL Server常用的系统存储过程应用实例

    摘要:Sql Server自带的系统存储过程有许多,但大部分我们是不常用的.我在实践中根据自己的体会,总结整理了一些比较常用的,加上一些实例介绍给大家.本期介绍: l         sp_attac ...

最新文章

  1. Armadillo脱壳练习笔记(一)
  2. 从Demo到日千万PV,就是快! – 爱线下的上云实践
  3. linux 添加动态链接库路径
  4. 上项线体表位置_实用人体体表解剖:头颈部(高清大图版)
  5. linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?
  6. hasOwnProperty
  7. 剑指offer 调整数组顺序使奇数位于偶数前面
  8. java什么是子类_java什么是子类?
  9. datatable使用groupby进行分组统计 .
  10. Intel 64/x86_64/IA-32/x86处理器 - 指令格式(8) - 80386/32位指令前缀
  11. 未来网络安全重塑,保障安全的会不会只有四五家?
  12. ssh 执行 SSH2_MSG_SERVICE_ACCEPT 慢问题
  13. 放大你的Rstudio窗口字体
  14. ModifyStyle, ModifyStyleEx
  15. MultiButton | 一个小巧简单易用的事件驱动型按键驱动模块
  16. 云服务器的1m带宽是多少kbps
  17. FX5 C的编程语言,三菱 FX5UC系列PLC性能规格/参数说明
  18. 音视频社交的应用和优势
  19. “迷信”或是超前科学:朱清时谈量子
  20. python爬虫笔记四:大众点评店铺信息(字体反爬-静态映射)

热门文章

  1. 干货!请码住——点此领取免费开源框架
  2. AWS Lambda现已支持.NET Core 2.0
  3. 一步步部署基于Windows系统的Jenkins持续集成环境
  4. java程序猿面试问缺点怎么回答_JAVA程序员面试32问,你能回答多少题
  5. [转]一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
  6. CSDN,CNBLOGS博客文章一键转载插件 终于更新了!
  7. 淘宝网的技术发展史(三)——分布式时代
  8. 【ArcGIS Pro微课1000例】0013:NOAA全球1km分辨率DEM下载及拼接教程(附已拼接成果下载地址)
  9. C和指针之实现可变参数函数编译出现expanded from macro ‘va_arg‘ #define va_arg(ap, type) 解决办法
  10. 字符串之替换字符串中连续出现的指定字符串