Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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 server 在另一个存储过程中执行存储过程_Sql Server - Fatal编程技术网

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。