C# 将值从一个存储过程返回到另一个存储过程

C# 将值从一个存储过程返回到另一个存储过程,c#,asp.net,sql-server,stored-procedures,C#,Asp.net,Sql Server,Stored Procedures,我想使用从一个存储过程到另一个存储过程的返回值。我在互联网上搜索并尝试了几种解决方案,但都不起作用,我不知道我犯了什么错误 我要使用其返回值的存储过程是: CREATE PROCEDURE dbo.pro_ForeignKeyCheck (@tableName VARCHAR(100), @columnName VARCHAR(100), @idValue INT) AS BEGIN SET NOCOUNT ON DECLARE fksCur

我想使用从一个存储过程到另一个存储过程的返回值。我在互联网上搜索并尝试了几种解决方案,但都不起作用,我不知道我犯了什么错误

我要使用其返回值的存储过程是:

CREATE PROCEDURE dbo.pro_ForeignKeyCheck
     (@tableName VARCHAR(100),
      @columnName VARCHAR(100),
      @idValue INT) 
AS BEGIN
    SET NOCOUNT ON

    DECLARE fksCursor CURSOR FAST_FORWARD FOR 
        SELECT 
            tc.table_name, ccu.column_name
        FROM
            information_schema.table_constraints tc 
        JOIN
            information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name 
        JOIN
            information_schema.referential_constraints rc ON tc.constraint_name = rc.constraint_name 
        JOIN
            information_schema.table_constraints tc2 ON rc.unique_constraint_name = tc2.constraint_name 
        JOIN
            information_schema.constraint_column_usage ccu2 ON tc2.constraint_name = ccu2.constraint_name 
        WHERE
            tc.constraint_type = 'Foreign Key' 
            AND tc2.table_name = @tableName 
            AND ccu2.column_name = @columnName
        ORDER BY
            tc.table_name

    DECLARE @fkTableName VARCHAR(100),
            @fkColumnName VARCHAR(100),
            @fkFound BIT,
            @params NVARCHAR(100),
            @sql NVARCHAR(500)

    OPEN fksCursor

    FETCH NEXT FROM fksCursor INTO @fkTableName, @fkColumnName

    SET @fkFound = 0
    SET @params = N'@fkFound BIT OUTPUT'

    WHILE @@fetch_status = 0 AND COALESCE(@fkFound, 0) <> 1 
    BEGIN
        SELECT @sql = 'set @fkFound = (select top 1 1 from [' + @fkTableName + '] where [' + @fkColumnName + '] = ' + cast(@idValue as varchar(10)) + ')'
        PRINT @sql

        EXEC sp_executesql @sql, @params, @fkFound OUTPUT

        FETCH NEXT FROM fksCursor INTO @fkTableName, @fkColumnName
    END

    CLOSE fksCursor
    DEALLOCATE fksCursor

    SELECT COALESCE(@fkFound, 0)
    RETURN 0
END

它可以工作,但我不能在其他存储过程中使用返回值

CREATE  PROCEDURE [dbo].[pro_Delete_acount]
    @UserID int,
    @Action NVARCHAR(10)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE  @count int , @ErrNo int , @ErrMsg varchar(2000), @exit int



    set @exit=0
    if @Action ='ADMIN'
    begin
    /*---------Call Store Procedure pro_ForeignKeyCheck to check if there is value are exit in child table*/
    --EXEC  @exit = pro_ForeignKeyCheck1 @tablename='tb_M_admin',@columnName='admin_id',@idValue= @UserID 
    --select @exit

    --EXEC   @exit = pro_ForeignKeyCheck  @tablename='tb_M_admin',@columnName='admin_id',@idValue= 1

    EXEC @exit = pro_ForeignKeyCheck 'tb_M_admin','admin_id', 0 
    --select @exit

    select -2[Ret_Status],@exit[ErrNo],0[ErrMsg] -- test 

    end
end
有人能帮我吗

谢谢大家

EXEC @exit = pro_ForeignKeyCheck 'tb_M_admin','admin_id', 0 

---
select coalesce(@fkFound,0)
return 0 --< this will be assigned to @exit

您可以出于其他目的离开
select
,但这不会影响
返回值。因此,您也可以将其删除。

这是一个SP从另一个SP调用的过于简化的示例。我希望它能给你一些想法

create procedure dbo.first_proc
@bd datetime,
@d int output
as
select @d= DATEDIFF(day,@bd,getdate()) 
go

create procedure dbo.sec_proc
@birthday datetime
as
declare @days int
exec dbo.first_proc @birthday, @days output

select 'you live '+cast(@days as varchar) + ' days' result
go

exec dbo.sec_proc '1959-09-17'

pro_ForeignKeyCheck
中,它以

CREATE PROCEDURE dbo.pro_ForeignKeyCheck1
@tableName VARCHAR(100),
@columnName VARCHAR(100),
@idValue int,
@Status int OUTPUT
最后,我做了如下的事情

--select coalesce(@fkFound,0)
select @Status = coalesce(@fkFound,0)
--return 0
停止最后一行并添加新的

在另一个存储过程中,按如下方式调用它

EXEC  pro_ForeignKeyCheck1 'tb_M_admin','admin_id', 0 ,@exit output 
select @exit
现在将使用返回值


感谢所有的

可能您需要在SPsDear@AlexKudryashev中的某个地方使用
output
关键字,我尝试了一下,但不起作用。您需要创建不带out参数的存储过程。您可以参考下面的文章以供参考测试您的
光标
代码-它返回任何东西吗?
从tb_M_admin中选择*,其中admin_id=0
-此返回任何东西吗?亲爱的,在我的示例中,我尝试了正确和错误的admin_id并返回相同的东西,但现在我尝试了@alex Kudryashev所说的方法并获得了它。非常感谢AllThank亲爱的alex Kudryashev我明白了
@Status int OUTPUT
CREATE PROCEDURE dbo.pro_ForeignKeyCheck1
@tableName VARCHAR(100),
@columnName VARCHAR(100),
@idValue int,
@Status int OUTPUT
--select coalesce(@fkFound,0)
select @Status = coalesce(@fkFound,0)
--return 0
EXEC  pro_ForeignKeyCheck1 'tb_M_admin','admin_id', 0 ,@exit output 
select @exit