想建一个自定义函数,跟据SPID返回当前用户所执行的SQL语句,基本如下CREATE FUNCTION ufn_GetUserExecSQL(@UserID int)
RETURNS Nvarchar(Max)
AS
BEGIN 
DECLARE @UserExecSql Nvarchar(Max)
DECLARE @UserSql Table
(        
[EventType] VARCHAR(100),
[Parameters] FLOAT,
[EventInfo] NVARCHAR(max)
)      
INSERT INTO @UserSql([EventType],[Parameters],[EventInfo])
EXEC ('DBCC INPUTBUFFER('+@UserID+')') SELECT @UserExecSql=[EventInfo] FROM @UserSql
RETURN @UserExecSql
END
go创建时出现下面错误提示:
消息 443,级别 16,状态 14,过程 ufn_GetUserExecSQL,第 12 行
在函数内对带副作用的运算符 'INSERT EXEC' 的使用无效。高手帮想个法子如何解决,希望用函数,因为我想在SQL中调用,如:
SELECT dbo.ufn_GetUserExecSQL(spid),* FROM SYS.sysprocesses
WHERE SPID>50

解决方案 »

  1.   

    CREATE PROC [dbo].[dba_WhatSQLIsExecuting]
    AS
    BEGIN
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    SELECT [Spid] = session_Id
    , ecid
    , [Database] = DB_NAME(sp.dbid)
    , [User] = nt_username
    , [Status] = er.status
    , [Wait] = wait_type
    , [Individual Query] = SUBSTRING (qt.text,
    er.statement_start_offset/2,
    (CASE WHEN er.statement_end_offset = -1
    THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
    ELSE er.statement_end_offset END -
    er.statement_start_offset)/2)
    ,[Parent Query] = qt.text
    , Program = program_name
    , Hostname
    , nt_domain
    , start_time
    FROM sys.dm_exec_requests er
    INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
    CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
    WHERE session_Id > 50 -- Ignore system spids.
    AND session_Id NOT IN (@@SPID) ORDER BY 1, 2
    END
      

  2.   

    能没有人帮手改成一个可用的脚本,直接给分。另外楼上给的SQL只能拿到当前在运行的SQL语句,并不能满足要求。