Sql server 在另一个存储过程中执行存储过程
我正在从主存储过程执行另一个存储过程。主要存储过程如下所示Sql server 在另一个存储过程中执行存储过程,sql-server,Sql Server,我正在从主存储过程执行另一个存储过程。主要存储过程如下所示 ALTER Procedure [dbo].[SaveLabTestEntry] ( @LE_No nvarchar(100)=null, @hcp_id varchar(25)=null, @Pat_prof_Id nvarchar(100)=null, @Usr_Id nvarchar(100)=null, @LE_D
ALTER Procedure [dbo].[SaveLabTestEntry]
(
@LE_No nvarchar(100)=null,
@hcp_id varchar(25)=null,
@Pat_prof_Id nvarchar(100)=null,
@Usr_Id nvarchar(100)=null,
@LE_Date nvarchar(100)=null,
@LE_Time nvarchar(100)=null,
@HospitalName nvarchar(100)=null,
@Mode nvarchar(10)=null,
@dt LabEntryD_TVP READONLY
)
AS
Declare @ResultMsg as nvarchar(50)
Declare @MaxID as Int
Declare @Status as Int
Begin
BEGIN TRY
BEGIN TRANSACTION SaveData
IF @Mode='ADD'
BEGIN
IF @HospitalName IS NOT NULL AND @HospitalName<>''
BEGIN
EXEC @hcp_id= InsertPatAddedHosp @HospitalName, @Usr_Id
END
SET @MaxID = (SELECT [Vr_No] + 1 FROM [VrLastNo] WHERE [Vr_Code]='LAB-H' AND [Loc_Id]=1 AND [Co_Cd]='HO')
SET @LE_No = 'P'+CAST(@MaxID AS NVARCHAR(100))
INSERT INTO HCPLabEntryH(LE_No, hcp_id, Pat_prof_Id, Usr_Id, LE_Date, LE_Time, Entry_Type)
VALUES (@LE_No, @hcp_id, @Pat_prof_Id, @Usr_Id, @LE_Date, @LE_Time, 'P')
INSERT INTO HCPLabEntryD(
hcp_id, Pat_prof_Id, LE_No, LED_Ctr, Test_Cd, Test_Desc,
LED_Result, LED_Normal_Value)
SELECT
@hcp_id, @Pat_prof_Id, @LE_No, tvp.LabTestCtr, tvp.TestCd, tvp.TestName,
tvp.TestResult, tvp.NormalValue
FROM @dt tvp
SET @ResultMsg='Saved Successfully..'
Set @Status=1
UPDATE [VrLastNo] SET [Vr_No]= @MaxID WHERE [Vr_Code]='LAB-H' AND [Loc_Id]=1 AND [Co_Cd]='HO'
END
IF @Mode='EDIT'
BEGIN
IF @HospitalName IS NOT NULL AND @HospitalName<>''
BEGIN
EXEC @hcp_id= InsertPatAddedHosp @HospitalName, @Usr_Id
END
UPDATE HCPLabEntryH SET
hcp_id=@hcp_id, Pat_prof_Id=@Pat_prof_Id, Usr_Id=@Usr_Id, LE_Date=@LE_Date, LE_Time=@LE_Time
WHERE LE_No=@LE_No
DELETE FROM HCPLabEntryD WHERE LE_No=@LE_No
INSERT INTO HCPLabEntryD(
hcp_id, Pat_prof_Id, LE_No, LED_Ctr, Test_Cd, Test_Desc,
LED_Result, LED_Normal_Value)
SELECT
@hcp_id, @Pat_prof_Id, @LE_No, tvp.LabTestCtr, tvp.TestCd, tvp.TestName,
tvp.TestResult, tvp.NormalValue
FROM @dt tvp
Set @Status=1
SET @ResultMsg='Updated Successfully..'
END
IF @Mode='DELETE'
BEGIN
DELETE FROM HCPLabEntryH WHERE LE_No=@LE_No
DELETE FROM HCPLabEntryD WHERE LE_No=@LE_No
Set @Status=1
SET @ResultMsg='Deleted Successfully..'
END
SELECT @ResultMsg as ResultMsg,@Status as [Status],0 as Id
COMMIT TRANSACTION SaveData
END TRY
BEGIN CATCH
rollback transaction SaveData;
Set @Status=0
select Error_Message() as ResultMsg,@Status as [Status],0 as Id
END CATCH
End
我的问题来自主sp中的下一行
IF @HospitalName IS NOT NULL AND @HospitalName<>''
BEGIN
EXEC @hcp_id= InsertPatAddedHosp @HospitalName, @Usr_Id
END
您应该为此使用一个输出参数。下面是一个非常简单的示例,说明如何将可变参数从一个进程传递到另一个进程:
CREATE PROCEDURE innerProcedure
@user_id INT,
@hcp_id INT OUTPUT
AS
BEGIN
IF @user_id = 1
SET @hcp_id = 100
ELSE
SET @hcp_id = 200
END
GO
CREATE PROCEDURE outerProcedure
@user_id INT
AS
BEGIN
DECLARE @hcp_id INT
EXEC innerProcedure @user_id, @hcp_id OUTPUT
SELECT @hcp_id
END
GO
使用params 1和除1以外的任何选项进行尝试:
EXEC outerProcedure 1
返回100
EXEC outerProcedure 2
返回200
注意:outerProcedure将@hcp_id传递到innerProcedure,innerProcedure使用SET操作修改其值,然后将该值传递回outerProcedure。注意:在编写接受param的过程时以及在任何时候调用它时,都需要包含输出
我认为您需要进行以下更改:
ALTER PROCEDURE [dbo].[InsertPatAddedHosp]
(
@HospitalName nvarchar(100),
@UserId nvarchar(100),
@HcpId nvarchar(25) OUTPUT
)
As
Begin
DECLARE @MaxHcpId int
IF NOT EXISTS (SELECT Hcp_Name FROM HCPPatAdded WHERE [User_Id]=@UserId AND Hcp_Name=@HospitalName)
BEGIN
SET @MaxHcpId= (SELECT ISNULL((SELECT ISNULL([VALUE],0) FROM [Param] WHERE [KEY]='PatAddedHosId'),0))
SET @HcpId='H'+CAST((@MaxHcpId+1) AS NVARCHAR(100))
IF @MaxHcpId = 0
BEGIN
INSERT INTO [Param]([KEY], [YEAR], [VALUE]) VALUES ('PatAddedHosId', -1, 1)
END
ELSE
BEGIN
UPDATE [Param] SET [VALUE]=@MaxHcpId+1 WHERE [KEY]='PatAddedHosId'
END
INSERT INTO HCPPatAdded(Hcp_Id, Hcp_Name, [User_Id]) VALUES(@HcpId, @HospitalName, @UserId)
END
ELSE
BEGIN
SELECT @HcpId = Hcp_Id FROM HCPPatAdded WHERE [User_Id]=@UserId AND Hcp_Name=@HospitalName
END
End
然后,与此相反:
EXEC @hcp_id= InsertPatAddedHosp @HospitalName, @Usr_Id
称之为:
EXEC InsertPatAddedHosp @HospitalName, @Usr_Id, @hcp_id OUTPUT
另外,将@hcp_id的数据类型更改为nvarhar25,而不是varchar25,以匹配InsertPatAddedHosp中的数据类型。您应该为此使用一个输出参数。下面是一个非常简单的示例,说明如何将可变参数从一个进程传递到另一个进程:
CREATE PROCEDURE innerProcedure
@user_id INT,
@hcp_id INT OUTPUT
AS
BEGIN
IF @user_id = 1
SET @hcp_id = 100
ELSE
SET @hcp_id = 200
END
GO
CREATE PROCEDURE outerProcedure
@user_id INT
AS
BEGIN
DECLARE @hcp_id INT
EXEC innerProcedure @user_id, @hcp_id OUTPUT
SELECT @hcp_id
END
GO
使用params 1和除1以外的任何选项进行尝试:
EXEC outerProcedure 1
返回100
EXEC outerProcedure 2
返回200
注意:outerProcedure将@hcp_id传递到innerProcedure,innerProcedure使用SET操作修改其值,然后将该值传递回outerProcedure。注意:在编写接受param的过程时以及在任何时候调用它时,都需要包含输出
我认为您需要进行以下更改:
ALTER PROCEDURE [dbo].[InsertPatAddedHosp]
(
@HospitalName nvarchar(100),
@UserId nvarchar(100),
@HcpId nvarchar(25) OUTPUT
)
As
Begin
DECLARE @MaxHcpId int
IF NOT EXISTS (SELECT Hcp_Name FROM HCPPatAdded WHERE [User_Id]=@UserId AND Hcp_Name=@HospitalName)
BEGIN
SET @MaxHcpId= (SELECT ISNULL((SELECT ISNULL([VALUE],0) FROM [Param] WHERE [KEY]='PatAddedHosId'),0))
SET @HcpId='H'+CAST((@MaxHcpId+1) AS NVARCHAR(100))
IF @MaxHcpId = 0
BEGIN
INSERT INTO [Param]([KEY], [YEAR], [VALUE]) VALUES ('PatAddedHosId', -1, 1)
END
ELSE
BEGIN
UPDATE [Param] SET [VALUE]=@MaxHcpId+1 WHERE [KEY]='PatAddedHosId'
END
INSERT INTO HCPPatAdded(Hcp_Id, Hcp_Name, [User_Id]) VALUES(@HcpId, @HospitalName, @UserId)
END
ELSE
BEGIN
SELECT @HcpId = Hcp_Id FROM HCPPatAdded WHERE [User_Id]=@UserId AND Hcp_Name=@HospitalName
END
End
然后,与此相反:
EXEC @hcp_id= InsertPatAddedHosp @HospitalName, @Usr_Id
称之为:
EXEC InsertPatAddedHosp @HospitalName, @Usr_Id, @hcp_id OUTPUT
另外,将@hcp_id的数据类型更改为nvarchar25,而不是varchar25,以匹配InsertPatAddDHOSP中的数据类型。我的问题来自下一行,什么问题??如果你解释了这一点,我们就可以很容易地提供帮助:如果你问的是关于T-SQL的问题,不要将其标记为C。我的问题来自下面一行,什么问题??如果你解释了这一点,我们将很容易提供帮助:如果你问的是关于T-SQL的问题,不要把它标记为C。