Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何用另一个存储过程执行一个存储过程?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何用另一个存储过程执行一个存储过程?

Sql 如何用另一个存储过程执行一个存储过程?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个sessionlock过程,当一个过程在一个会话中运行时,如果同一个过程在运行另一个会话,它将在第一个会话完成之前不会执行 EXEC dbo.[system-LockProcedure]'dbo.usp_Test1' 它工作正常,我没有问题,但当我想用输入参数执行过程时,我得到一个错误: DECLARE @threadid INT = 0; EXEC [util].[system-LockProcedure] N'[dbo].[usp_Test1] @threadid=@threa

我有一个sessionlock过程,当一个过程在一个会话中运行时,如果同一个过程在运行另一个会话,它将在第一个会话完成之前不会执行

EXEC dbo.[system-LockProcedure]'dbo.usp_Test1' 
它工作正常,我没有问题,但当我想用输入参数执行过程时,我得到一个错误:

DECLARE @threadid INT = 0;

EXEC [util].[system-LockProcedure] N'[dbo].[usp_Test1] @threadid=@threadid', 
                       N'@threadid INT', 
                         @threadid=@threadid
错误:

[dbo].[usp_Test1]需要参数@threadid,但未提供该参数

当我执行一个没有输入参数的过程时,它工作正常;当我想要执行一个有输入参数的过程时,它抛出一个错误

请建议如何修复此问题

系统锁定程序:

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

在存储过程结束之前,使用要执行的过程名及其相应的参数,如:

Alter procedure Procedure1
As
begin
  select * from TableName
  Exec Procedure2 
end
试试这个:

DECLARE @threadid INT = 0;

DECLARE @ExecuteString NVARCHAR(MAX) = N'[dbo].[usp_Test1] @threadid= ' + CAST(@threadid AS VARCHAR(4)) + ';'

EXEC [util].[system-LockProcedure] @ExecuteString;

什么是系统锁定过程?这是锁定会话过程,我只需要从外部调用该过程。为什么以“;”结束@AF先生,所有语句都以语句终止符结尾是一种良好的做法;。不放是不推荐的行为-@mohan111 xm。。奇怪-所以你把输入参数的值改成了nvarchar,对吗?是的@gotqn,我刚刚试过这种方法,但它不起作用