执行存储过程调用创建过程

时间:2018-12-06 05:52:28

标签: sql-server stored-procedures

我认为我在SQL Server 2017中是一个相当简单的存储过程。它基本上只是从三个表中删除一些数据,并在事务内完成。

我有此存储过程的删除/创建脚本,这些脚本作为Entity Framework播种的一部分运行。这是创建过程的唯一位置,并且根据日志记录语句,它似乎只能按预期在部署时执行一次。

这是问题所在...有时我会遇到一些严重的性能问题,它们似乎与数据库性能有关。当我查看应用程序日志时,我看到此存储过程正在执行。但是,当我查看当前正在执行的查询时,它正在尝试为此存储过程运行创建过程查询。

我正在使用以下查询来查看正在运行的查询:

SELECT 
    sqltext.TEXT, req.session_id, req.status, 
    req.command, req.cpu_time, req.total_elapsed_time 
FROM 
    sys.dm_exec_requests req 
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS sqltext

我对SQL Server有相当的经验,但是对存储过程却没有那么多的经验,而且我似乎找不到任何建议创建过程查询应作为执行存储过程的一部分运行的文档。

运行创建过程很奇怪吗?还是执行存储过程时正常?

2 个答案:

答案 0 :(得分:0)

这是正常的。如果要查看正在执行的特定语句,则需要使用statement_start_offset中的statement_end_offsetsys.dm_exec_requests

SELECT 
CASE   
        WHEN req.[statement_start_offset] > 0 THEN  
            CASE req.[statement_end_offset]  
               WHEN -1 THEN  
                  SUBSTRING(sqltext.TEXT, (req.[statement_start_offset]/2) + 1, 2147483647) 
               ELSE   
                  SUBSTRING(sqltext.TEXT, (req.[statement_start_offset]/2) + 1, (req.[statement_end_offset] - req.[statement_start_offset])/2+1)   
            END  
        ELSE  
            CASE req.[statement_end_offset]  
               WHEN -1 THEN  
                  RTRIM(LTRIM(sqltext.[text]))  
               ELSE  
                  LEFT(sqltext.TEXT, (req.[statement_end_offset]/2) +1)  
            END  
        END AS [executing statement],
    sqltext.TEXT, req.session_id, req.status, 
    req.command, req.cpu_time, req.total_elapsed_time 
FROM 
    sys.dm_exec_requests req 
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS sqltext

答案 1 :(得分:0)

这进一步说明了这个问题:

sys.dm_exec_sql_text DMF仅返回SQL查询的文本 执行查询文本以及其他详细信息(dbid,objectid等)。

如果您正在执行即席执行,您将看到执行语句。但 对于proc,它将选择proc的文本而不是执行语句。

如果要获取当前执行的部分:

SELECT  r.session_id ,
    OBJECT_NAME(qt.objectid, qt.dbid) AS [Stored procedure name],
    SUBSTRING(qt.[text], r.statement_start_offset / 2,
        ( CASE WHEN r.statement_end_offset = -1
               THEN LEN(CONVERT(NVARCHAR(MAX), qt.[text])) * 2
               ELSE r.statement_end_offset
          END - r.statement_start_offset ) / 2) AS [statement_executing] 
FROM    sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt
WHERE   r.session_id > 50

MSDN forum

中找到了它