Я пытаюсь получить данные входного буфера (DBCC INPUTBUFFER(@SPID)
) для каждой записи, возвращаемой для базы данных при запросе таблицы SYSPROCESSES
. Мне интересно услышать, есть ли лучший способ сделать это, но я также был бы признателен за исправление того, что у меня сейчас есть в учебных целях.
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
Теперь, когда я выполняю следующий запрос:
SELECT SPID
FROM MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'Northwinds' AND DBID != 0
возвращает 31 строку ...
Однако, когда я SELECT * FROM #TempResults
после выполнения вышеупомянутого цикла, я возвращаю массовое количество дубликатов в временной таблице ... на сумму 10751.
Опять же, это в основном для обучения, но было бы довольно удобной функцией. Я ищу информацию о том, что мне не хватает, что приводит к возврату дубликатов записей, а также возможное лучшее решение.