加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLSERVER 执行sp_who2 显示的LastBatch列时间显示不正确

发布时间:2020-12-12 13:58:19 所属栏目:MsSql教程 来源:网络整理
导读:SET QUOTED_IDENTIFIER ONSET ANSI_NULLS ONGOcreate procedure sys.sp_who2 --- 1995/11/03 10:16 @loginame sysname = NULLasset nocount ondeclare @retcode intdeclare @sidlow varbinary(85),@sidhigh varbinary(85),@sid1 varbinary(85),@spidlow int,

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
create procedure sys.sp_who2  --- 1995/11/03 10:16
    @loginame     sysname = NULL
as

set nocount on

declare
    @retcode         int

declare
    @sidlow         varbinary(85),@sidhigh        varbinary(85),@sid1           varbinary(85),@spidlow         int,@spidhigh        int

declare
    @charMaxLenLoginName      varchar(6),@charMaxLenDBName         varchar(6),@charMaxLenCPUTime        varchar(10),@charMaxLenDiskIO         varchar(10),@charMaxLenHostName       varchar(10),@charMaxLenProgramName    varchar(10),@charMaxLenLastBatch      varchar(10),@charMaxLenCommand        varchar(10)

declare
    @charsidlow              varchar(85),@charsidhigh             varchar(85),@charspidlow              varchar(11),@charspidhigh             varchar(11)

-- defaults

select @retcode         = 0      -- 0=good,1=bad.
select @sidlow = convert(varbinary(85),(replicate(char(0),85)))
select @sidhigh = convert(varbinary(85),(replicate(char(1),85)))

select
    @spidlow         = 0,@spidhigh        = 32767

--------------------------------------------------------------
IF (@loginame IS     NULL)  --Simple default to all LoginNames.
      GOTO LABEL_17PARM1EDITED

-- select @sid1 = suser_sid(@loginame)
select @sid1 = null
if exists(select * from sys.syslogins where loginname = @loginame)
	select @sid1 = sid from sys.syslogins where loginname = @loginame

IF (@sid1 IS NOT NULL)  --Parm is a recognized login name.
   begin
   select @sidlow  = suser_sid(@loginame),@sidhigh = suser_sid(@loginame)
   GOTO LABEL_17PARM1EDITED
   end

--------

IF (lower(@loginame collate Latin1_General_CI_AS) IN ('active'))  --Special action,not sleeping.
   begin
   select @loginame = lower(@loginame collate Latin1_General_CI_AS)
   GOTO LABEL_17PARM1EDITED
   end

--------

IF (patindex ('%[^0-9]%',isnull(@loginame,'z')) = 0)  --Is a number.
   begin
   select
             @spidlow   = convert(int,@loginame),@spidhigh  = convert(int,@loginame)
   GOTO LABEL_17PARM1EDITED
   end

--------

raiserror(15007,-1,@loginame)
select @retcode = 1
GOTO LABEL_86RETURN


LABEL_17PARM1EDITED:


--------------------  Capture consistent sysprocesses.  -------------------

select

  spid,status,sid,hostname,program_name,cmd,cpu,physical_io,blocked,dbid,convert(sysname,rtrim(loginame))
        as loginname,spid as 'spid_sort',substring( convert(varchar,last_batch,111),6,5 ) + ' '
  + substring( convert(varchar,113),13,8 )--这个地方时间截取有问题 应改成+ substring( convert(varchar,12,8 )
 as 'last_batch_char',request_id into #tb1_sysprocesses?
from sys.sysprocesses_ex with (nolock)--系统无法找这个表 只能改成sys.sysprocesses
if @@error <> 0
	begin
		select @retcode = @@error
		GOTO LABEL_86RETURN
	end

--------Screen out any rows?

if (@loginame in ('active'))
   delete #tb1_sysprocesses
         where   lower(status)  = 'sleeping'
         and     upper(cmd)    in (
                     'AWAITING COMMAND','LAZY WRITER','CHECKPOINT SLEEP'
                                  )

         and     blocked       = 0



--------Prepare to dynamically optimize column widths.


select
    @charsidlow     = convert(varchar(85),@sidlow),@charsidhigh    = convert(varchar(85),@sidhigh),@charspidlow     = convert(varchar,@spidlow),@charspidhigh    = convert(varchar,@spidhigh)



select
             @charMaxLenLoginName =
                  convert( varchar,isnull( max( datalength(loginname)),5)
                         ),@charMaxLenDBName    =
                  convert( varchar,isnull( max( datalength( rtrim(convert(varchar(128),db_name(dbid))))),6)
                         ),@charMaxLenCPUTime   =
                  convert( varchar,cpu)))),7)
                         ),@charMaxLenDiskIO    =
                  convert( varchar,physical_io)))),@charMaxLenCommand  =
                  convert( varchar,cmd)))),@charMaxLenHostName  =
                  convert( varchar,hostname)))),8)
                         ),@charMaxLenProgramName =
                  convert( varchar,program_name)))),11)
                         ),@charMaxLenLastBatch =
                  convert( varchar,last_batch_char)))),9)
                         )
      from
             #tb1_sysprocesses
      where
             spid >= @spidlow
      and    spid <= @spidhigh



--------Output the report.


EXEC(
'
SET nocount off

SELECT
             SPID          = convert(char(5),spid),Status        =
                  CASE lower(status)
                     When ''sleeping'' Then lower(status)
                     Else                   upper(status)
                  END,Login         = substring(loginname,1,' + @charMaxLenLoginName + '),HostName      =
                  CASE hostname
                     When Null  Then ''  .''
                     When '' '' Then ''  .''
                     Else    substring(hostname,' + @charMaxLenHostName + ')
                  END,BlkBy         =
                  CASE               isnull(convert(char(5),blocked),''0'')
                     When ''0'' Then ''  .''
                     Else            isnull(convert(char(5),''0'')
                  END,DBName        = substring(case when dbid = 0 then null when dbid <> 0 then db_name(dbid) end,' + @charMaxLenDBName + '),Command       = substring(cmd,' + @charMaxLenCommand + '),CPUTime       = substring(convert(varchar,cpu),' + @charMaxLenCPUTime + '),DiskIO        = substring(convert(varchar,physical_io),' + @charMaxLenDiskIO + '),LastBatch     = substring(last_batch_char,' + @charMaxLenLastBatch + '),ProgramName   = substring(program_name,' + @charMaxLenProgramName + '),SPID          = convert(char(5),spid)  --Handy extra for right-scrolling users.,REQUESTID       = convert(char(5),request_id)
      from
             #tb1_sysprocesses  --Usually DB qualification is needed in exec().
      where
             spid >= ' + @charspidlow  + '
      and    spid <= ' + @charspidhigh + '

      -- (Seems always auto sorted.)   order by spid_sort

SET nocount on
'
)


LABEL_86RETURN:


if (object_id('tempdb..#tb1_sysprocesses') is not null)
            drop table #tb1_sysprocesses

return @retcode -- sp_who2
GO

 因为修改系统存储过程麻烦 故新增一个存储过程代替sp_who2 
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
create procedure sys.sp_who4  --- 2013-06-20
    @loginame     sysname = NULL
as

set nocount on

declare
    @retcode         int

declare
    @sidlow         varbinary(85),5 ) + ' '
+ substring( convert(varchar,8 )

       as 'last_batch_char',request_id

      into    #tb1_sysprocesses
      from sys.sysprocesses with (nolock)
sys.sysprocesses


if @@error <> 0
	begin
		select @retcode = @@error
		GOTO LABEL_86RETURN
	end

--------Screen out any rows?

if (@loginame in ('active'))
   delete #tb1_sysprocesses
         where   lower(status)  = 'sleeping'
         and     upper(cmd)    in (
                     'AWAITING COMMAND',request_id)
      from
             #tb1_sysprocesses  --Usually DB qualification is needed in exec().
      where
             spid >= ' + @charspidlow  + '
      and    spid <= ' + @charspidhigh + '

      -- (Seems always auto sorted.)   order by spid_sort

SET nocount on
'
)


LABEL_86RETURN:


if (object_id('tempdb..#tb1_sysprocesses') is not null)
            drop table #tb1_sysprocesses

return @retcode -- sp_who4
GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读