How to execute a stored procedure with another stored procedure?(如何用另一个存储过程执行一个存储过程?)
问题描述
我有会话锁定程序,它执行一个程序在一个会话中运行时的操作,如果同一个程序正在另一个会话中运行,则在第一个会话完成之前它不会执行
I have session lock procedure which do the action of when one procedure is running in one session if the same procedure is running another session it will not execute until the first session completes
EXEC dbo.[system-LockProcedure]'dbo.usp_Test1'
它工作正常,我没有问题,但是当我想使用输入参数执行过程时,出现错误:
It is working fine and I have no issues but when I want to execute procedure with input parameters, I get an error:
DECLARE @threadid INT = 0;
EXEC [util].[system-LockProcedure] N'[dbo].[usp_Test1] @threadid=@threadid',
N'@threadid INT',
@threadid=@threadid
错误:
[dbo].[usp_Test1] 需要参数 @threadid,但未提供.
[dbo].[usp_Test1] expects parameter @threadid, which is not supplied.
当我执行一个没有输入参数的过程时,它工作正常,当我想执行一个带有输入参数的过程时,它会抛出一个错误.
When I'm executing a procedure with no input parameters it is working fine and when I want execute a procedure with input parameters, it throws an error.
请建议如何解决这个问题.
Please suggest how to fix this.
系统锁定程序:
CREATE Procedure [dbo].[system-LockProcedure] @procname varchar(200)
AS
--BEGIN TRAN
BEGIN
DECLARE @lockreturn int,
@lockresource varchar(200) --sysname
SELECT @lockresource = @procname
-- The below line will try to acquire an exclusive lock on the PROC for the session, If the Proc is already in execution the @lockreturn value will be > 0
EXEC @lockreturn = sp_getapplock @lockresource, @LockMode = 'Exclusive', @LockOwner = 'Session' , @LockTimeout = 100
Print @lockreturn
IF @lockreturn <> 0
BEGIN
RAISERROR ('Another instance of the procedure is already running', 16, 1)
RETURN
END
-- The Code to be executed goes here. All the core logic of the proc goes here..
Print 'Procedure Execution Started for user: ' + cast (CURRENT_USER as nvarchar(20))+ ' for session: ' + cast (@@SPID as nvarchar(10))
-- This is just to make the system wait for 30 seconds and make sure if there is any concurrent execution triggered will fail
exec @lockresource
Print 'Procedure Execution Ended for user: ' + cast (CURRENT_USER as nvarchar(20))+ ' for session: ' + cast (@@SPID as nvarchar(10))
Print @lockreturn
-- This is to release the lock once the SP code is ran completely
EXEC sp_releaseapplock @lockresource , 'Session'
-- END TRY
END
推荐答案
试试这个:
DECLARE @threadid INT = 0;
DECLARE @ExecuteString NVARCHAR(MAX) = N'[dbo].[usp_Test1] @threadid= ' + CAST(@threadid AS VARCHAR(4)) + ';'
EXEC [util].[system-LockProcedure] @ExecuteString;
这篇关于如何用另一个存储过程执行一个存储过程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何用另一个存储过程执行一个存储过程?
基础教程推荐
- SQL Server 实例在登录协商期间返回无效或不受支持的协议版本 2021-01-01
- 将 SQL Server DateTime 列迁移到 DateTimeOffset 2021-01-01
- 是否可以执行按位分组功能? 2021-01-01
- 如何使用 mysql.connector 禁用查询缓存 2022-01-01
- SQL:使用来自具有相同列名的两个表中的数据... 2021-01-01
- 无法解决整理冲突 2021-01-01
- 需要 MySQL 5.1 中的抽象触发器来更新审计日志 2021-01-01
- SQL 效率:WHERE IN 子查询 vs. JOIN 然后 GROUP 2021-01-01
- 在 SQL 中连接多个表 2021-01-01
- SSMS 中的权限问题:“对象 'extended_properties'、数据库 'mssqlsystem_resource'、... 错误 229)上的 SELECT 权限被拒绝" 2022-01-01
