Я ищу что-то вроде этого, где я мог бы сохранить вывод sp_who2 в таблице, без необходимости сначала создать таблицу:
create table test as exec sp_who2
Я ищу что-то вроде этого, где я мог бы сохранить вывод sp_who2 в таблице, без необходимости сначала создать таблицу:
create table test as exec sp_who2
Ответы:
Если вы используете SQL Server 2005 с пакетом обновления 1 (SP1) и более поздних версий , лучше всего использовать sp_whoisactive от Адама Мачаника. Это намного лучше, чем sp_who2 (см. Подробную серию месяцев на сайте, на который я ссылался).
Кендра (из команды Брента) имеет отличный пост по сбору данных из sp_WhoIsActive в таблице
USE yourDb;
CREATE TABLE temp_sp_who2
(
SPID INT,
Status VARCHAR(1000) NULL,
Login SYSNAME NULL,
HostName SYSNAME NULL,
BlkBy SYSNAME NULL,
DBName SYSNAME NULL,
Command VARCHAR(1000) NULL,
CPUTime INT NULL,
DiskIO BIGINT NULL, -- int
LastBatch VARCHAR(1000) NULL,
ProgramName VARCHAR(1000) NULL,
SPID2 INT
, RequestId INT NULL --comment out for SQL 2000 databases
)
INSERT INTO temp_sp_who2
EXEC sp_who2
SELECT *
FROM temp_sp_who2
WHERE DBName = 'yourDb'
Только что проверил на SQL Server 2012
Расширение решения Mihai для тех, кто хочет со временем это зафиксировать, например, для отслеживания активности на сервере:
IF OBJECT_ID('dbo.temp_sp_who2', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.temp_sp_who2;
END;
CREATE TABLE temp_sp_who2
(
SPID INT
,Status VARCHAR(1000) NULL
,LOGIN SYSNAME NULL
,HostName SYSNAME NULL
,BlkBy SYSNAME NULL
,DBName SYSNAME NULL
,Command VARCHAR(1000) NULL
,CPUTime INT NULL
,DiskIO INT NULL
,LastBatch VARCHAR(1000) NULL
,ProgramName VARCHAR(1000) NULL
,SPID2 INT
, RequestID INT NULL --comment out for SQL 2000 databases
, InsertedDate datetime DEFAULT GETDATE()
);
--This insert can be added to a job that runs periodically.
INSERT INTO temp_sp_who2
(
SPID
,Status
,LOGIN
,HostName
,BlkBy
,DBName
,Command
,CPUTime
,DiskIO
,LastBatch
,ProgramName
,SPID2
,RequestID
)
EXECUTE sp_who2;
SELECT *
FROM temp_sp_who2;
Вопрос задан для метода, который позволяет получить результаты без создания таблицы. Это делается с помощью табличной переменной:
CREATE PROC [dbo].[sp_who2db] (@DBName VARCHAR(200))
AS
BEGIN
DECLARE @who2 TABLE(
[SPID] INT,
[Status] VARCHAR(200),
[Login] VARCHAR(200),
[HostName] VARCHAR(200),
[BlkBy] VARCHAR(20),
[DBName] VARCHAR(200),
[Command] VARCHAR(200),
[CPUTime] BIGINT,
[DiskIO] BIGINT,
[LastBatch] VARCHAR(20),
[ProgramName] VARCHAR(200),
[SPID2] INT,
[RequestID] INT
)
INSERT @who2
EXEC sp_who2
SELECT * FROM @who2 WHERE DBName = @DBName
END