Sql server 2008 SQL Server:查询系统进程和InputBuffer
我正在尝试提取输入缓冲区数据DBCCINPUTBUFFER@SPID对于查询sysprocesss表时为数据库返回的每个记录。我很想知道是否有更好的方法来实现这一点,但也希望能纠正我目前为学习目的所做的工作Sql server 2008 SQL Server:查询系统进程和InputBuffer,sql-server-2008,with-statement,input-buffer,Sql Server 2008,With Statement,Input Buffer,我正在尝试提取输入缓冲区数据DBCCINPUTBUFFER@SPID对于查询sysprocesss表时为数据库返回的每个记录。我很想知道是否有更好的方法来实现这一点,但也希望能纠正我目前为学习目的所做的工作 DECLARE @Max [int] DECLARE @Min [int] = 1 SELECT @Max = COUNT(SPID) FROM MASTER.DBO.SYSPROCESSES WHERE DB_NAME(DBID) = 'Northwinds' AND DBID != 0
DECLARE @Max [int]
DECLARE @Min [int] = 1
SELECT @Max = COUNT(SPID)
FROM MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'Northwinds' AND DBID != 0
CREATE TABLE #Results (
EventType [nvarchar](1024),
Parameters [int],
EventInfo [nvarchar](1024),
SPID [int],
STATUS [nvarchar](255),
PROGRAM_NAME [nvarchar](1024),
CMD [nvarchar](255),
LOGINAME [nvarchar](255)
)
WHILE @Min <= @Max
BEGIN
DECLARE @SPID [int]
WITH SelectedRow AS (
SELECT SPID, ROW_NUMBER() OVER (ORDER BY SPID) AS RowNumber
FROM MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'Northwinds' AND DBID != 0
)
SELECT @SPID = SPID
FROM SelectedRow
WHERE RowNumber = @Min
DECLARE @InputBuffer TABLE (
EventType [nvarchar](1024),
Parameter [int],
EventInfo [nvarchar](1024)
)
DECLARE @SysProcesses TABLE (
SPID [int],
STATUS [nvarchar](255),
PROGRAM_NAME [nvarchar](1024),
CMD [nvarchar](255),
LOGINAME [nvarchar](255)
)
INSERT @InputBuffer
EXEC('DBCC INPUTBUFFER('+@SPID+')')
INSERT @SysProcesses
SELECT SPID, STATUS, PROGRAM_NAME, CMD, LOGINAME
FROM MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'Northwinds' AND DBID != 0 AND SPID = @SPID
INSERT INTO #TempResults(EventType, Parameters, EventInfo, SPID, STATUS, PROGRAM_NAME, CMD, LOGINAME)
SELECT *
FROM @InputBuffer, @SysProcesses
SET @Min = (@Min + 1)
END
它返回31行
但是,在执行上述循环之后,当我从TempResults中选择*时,我将返回temp表中大量的重复项…总数为10751
同样,这主要是为了学习,但也是一个非常方便的功能。我正在寻找我丢失的导致重复记录被返回的信息,以及可能更好的解决方案 您正在这样做:
INSERT #Results
SELECT *
FROM @InputBuffer, @SysProcesses
这实际上是一个交叉连接,所以如果任何一个表有多行,那么结果将是COUNTleft side*COUNTright side行。也许您应该使用SELECT DISTINCT column list,或者,正如我在评论中所建议的那样,停止循环使用已弃用的系统进程并从DBCC INPUTBUFFER检索信息,即使是出于痛苦的教育目的。请参阅下面的查询以获得更好的结果
DEclare @SPID [int]
DEclare @database_name [nvarchar](1024)
DEclare @hostname [nvarchar](1024)
DEclare @PROGRAM_NAME [nvarchar](1024)
DEclare @LOGINNAME [nvarchar](255)
DEclare @Inputbuffer [nvarchar] (4000)
CREATE TABLE #TempResults (
SPID [int],
database_name [nvarchar](1024),
hostname [nvarchar](1024),
PROGRAM_NAME [nvarchar](1024),
LOGINAME [nvarchar](255),
EventType [nvarchar](1024),
Parameters [int],
EventInfo [nvarchar](4000)
)
DECLARE db_cursor CURSOR FOR
select spid,db_name(dbid), hostname,program_name,loginame from sys.sysprocesses where dbid in(11,10,13,14,15,16)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @spid,@database_name,@hostname,@program_name,@loginname
WHILE @@FETCH_STATUS = 0
BEGIN
create table #InputBuffer1 (
EventType [nvarchar](1024),
Parameter [int],
EventInfo [nvarchar](4000)
)
INSERT into #InputBuffer1
EXEC('DBCC INPUTBUFFER('+@SPID+')')
create TABLE #SysProcesses (
SPID [int],
database_name [nvarchar](1024),
hostname [nvarchar](1024),
PROGRAM_NAME [nvarchar](1024),
LOGINAME [nvarchar](255)
)
INSERT INTO #SysProcesses(spid,database_name,hostname,program_name,LOGINAME)
SELECT @spid,@database_name,@hostname,@program_name,@loginname
insert into #TempResults
select * from #SysProcesses,#InputBuffer1
drop table #InputBuffer1
drop table #SysProcesses
FETCH NEXT FROM db_cursor INTO @spid,@database_name,@hostname,@program_name,@loginname
END
CLOSE db_cursor
DEALLOCATE db_cursor
select * from #TempResults
求你了,去叫精神分裂症患者来,别再头痛了@亚伦,谢谢你,这会非常有用的。我还试图扩展我的SQL知识,所以我仍然希望得到帮助,了解循环返回这么多记录的原因。谢谢
DEclare @SPID [int]
DEclare @database_name [nvarchar](1024)
DEclare @hostname [nvarchar](1024)
DEclare @PROGRAM_NAME [nvarchar](1024)
DEclare @LOGINNAME [nvarchar](255)
DEclare @Inputbuffer [nvarchar] (4000)
CREATE TABLE #TempResults (
SPID [int],
database_name [nvarchar](1024),
hostname [nvarchar](1024),
PROGRAM_NAME [nvarchar](1024),
LOGINAME [nvarchar](255),
EventType [nvarchar](1024),
Parameters [int],
EventInfo [nvarchar](4000)
)
DECLARE db_cursor CURSOR FOR
select spid,db_name(dbid), hostname,program_name,loginame from sys.sysprocesses where dbid in(11,10,13,14,15,16)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @spid,@database_name,@hostname,@program_name,@loginname
WHILE @@FETCH_STATUS = 0
BEGIN
create table #InputBuffer1 (
EventType [nvarchar](1024),
Parameter [int],
EventInfo [nvarchar](4000)
)
INSERT into #InputBuffer1
EXEC('DBCC INPUTBUFFER('+@SPID+')')
create TABLE #SysProcesses (
SPID [int],
database_name [nvarchar](1024),
hostname [nvarchar](1024),
PROGRAM_NAME [nvarchar](1024),
LOGINAME [nvarchar](255)
)
INSERT INTO #SysProcesses(spid,database_name,hostname,program_name,LOGINAME)
SELECT @spid,@database_name,@hostname,@program_name,@loginname
insert into #TempResults
select * from #SysProcesses,#InputBuffer1
drop table #InputBuffer1
drop table #SysProcesses
FETCH NEXT FROM db_cursor INTO @spid,@database_name,@hostname,@program_name,@loginname
END
CLOSE db_cursor
DEALLOCATE db_cursor
select * from #TempResults