Azure Synapse专用SQL池:不硬编码获取当前存储过程的object_id
在Azure Synapse专用SQL池中获取当前存储过程的Object ID
Azure Synapse专用SQL池不支持SQL Server中的@@PROCID系统变量,要避免硬编码存储过程名称来获取object_id,可以通过查询系统视图结合字符串解析实现,具体方案如下:
实现代码
DECLARE @current_proc_id INT; SELECT @current_proc_id = p.object_id FROM sys.dm_pdw_exec_requests req CROSS APPLY ( SELECT -- 从执行的SQL文本中提取存储过程的完整标识符 LTRIM(RTRIM( SUBSTRING(req.sql_text, CHARINDEX('CREATE PROCEDURE', req.sql_text) + 16, CHARINDEX(' ', req.sql_text, CHARINDEX('CREATE PROCEDURE', req.sql_text) + 16) - (CHARINDEX('CREATE PROCEDURE', req.sql_text) + 16) ) )) AS full_proc_name ) AS proc_info JOIN sys.procedures p ON p.name = PARSENAME(proc_info.full_proc_name, 1) AND SCHEMA_NAME(p.schema_id) = PARSENAME(proc_info.full_proc_name, 2) WHERE req.session_id = SESSION_ID() AND req.status = 'Running' AND req.sql_text LIKE '%CREATE PROCEDURE%'; -- 输出结果或用于后续逻辑 SELECT @current_proc_id AS CurrentProcedureObjectID;
逻辑说明
- 筛选当前会话的执行请求:利用
SESSION_ID()匹配sys.dm_pdw_exec_requests中当前会话的运行中请求。 - 解析存储过程名称:从请求的
sql_text字段中提取CREATE PROCEDURE语句后的存储过程完整名称(架构+名称)。 - 关联系统视图获取Object ID:通过解析出的名称,关联
sys.procedures视图,匹配对应的存储过程记录并获取object_id。
适配提示
- 若存储过程定义包含换行、注释或非标准格式,需要调整字符串解析的逻辑,确保准确提取名称。
- 当会话存在多个并行请求时,可添加
req.request_id的筛选(可结合会话上下文获取)来精准定位目标请求。
内容的提问来源于stack exchange,提问作者John Scott Stensland
相关产品推荐
相关产品推荐

