Det kan ibland upplevas svårt att skriva en update med join. Ett sätt att göra…
Jag fick under utövning av min roll som SQL Server konsult en fråga om man under körning av en procedur kan veta vad proceduren själv heter, och använda sig av det t ex i loggning av körningen ifrån den proceduren. – Ja, om man hårdkodar det i en variabel i början av proceduren svarade jag först. Men sånt måste väl finnas maskinellt tänkte jag sen. Och – här är resultatet av min spillda kafferast 🙂
Den här testprocedurens uppgift är förutom att visa att procedurnamnet går att fiska fram, också att från olika andra aspekter veta vem den är, och lite om och vad den gör och när den är skapad/ändrad och vem som kör den och från var osv. Har gjort lite förenklingar här och där, men jag tror att det mesta kan finnas nytta av i olika situationer. CREATEPROCEDURE WHOAMI_SP
AS ;WITH sysp (spid , kpid , blocked , waittype , waittime , lastwaittype , waitresource , dbid , uid , cpu , physical_io , memusage , login_time , last_batch , ecid , open_tran , status , sid , hostname , program_name , hostprocess , cmd , nt_domain , nt_username , net_address , net_library , loginame , context_info , sqlhandle , sqltext , stmt_start , stmt_end , request_id) AS (SELECT spid , kpid , blocked , waittype , waittime , lastwaittype , waitresource , dbid , uid , cpu , physical_io , memusage , login_time , last_batch , ecid , open_tran , status , sid , hostname , program_name , hostprocess , cmd , nt_domain , nt_username , net_address , net_library , loginame , context_info , sql_handle , ( SELECT SUBSTRING( text , COALESCE(NULLIF(stmt_start, 0), 1) , CASE stmt_end WHEN–1 THENDATALENGTH(text) ELSE (stmt_end – stmt_start) END ) FROM::fn_get_sql(sql_handle) )as sqltext , stmt_start , stmt_end , request_id FROMmaster.dbo.sysprocesses where spid =@@spid ) SELECT name AS‘Proceduren’ , sqltext.TEXTAS [vars definition är] , s.crdate AS [skapades] , s.refdate AS [modifierades senast] , req.session_id AS [kör nu med session_id] ,DB_NAME(sp.dbid)AS [i databasen] , sp.hostname AS [från servern] , sp.program_nameAS [i programmet] , sp.nt_domain AS [i domänen] , sp.loginame AS [av usern] , sp.login_time AS [som varit inloggad sedan] , req.statusAS [har just nu statusen] , req.command AS [medan den kör commandot] , sp.last_batch AS [vilket den gör sedan] , req.cpu_time AS [totalt har den i CPU använt] , req.total_elapsed_time AS [totalt har den i tid använt] , sp.lastwaittype AS [senast väntade den på väntetypen] ,CASE sp.blocked WHEN 0 THEN‘Ej blockad’ ELSE‘Blockad’ ENDAS [dess blockningsstatus är] FROMsys.dm_exec_requests req CROSSAPPLYsys.dm_exec_sql_text(sql_handle)AS sqltext JOINsys.sysobjects s ON sqltext.objectid = s.id JOIN sysp sp ON sp.spid = req.session_id WHERE s.type=‘p’ and req.session_id =@@SPID RETURN 0 GO EXEC WHOAMI_SP
Om du finner nytta av den här eller delar av den och vill använda den så varsågod – men “Tänk på att alltid köra i en kontrollerad testmiljö innan du produktionssätter främmande kod.”
/Jonas Bergström