Sql 嵌套存储过程

Sql 嵌套存储过程,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要创建一个存储过程,它将返回一个代码列表,然后我需要调用另一个存储过程来逐个检查每个代码 我该怎么做 CREATE PROCEDURE [dbo].[paBltBuscarBoletasASA] @id_Asa int AS DECLARE @Query int, @Contador int SET @Contador = 0 BEGIN SET NOCOUNT ON; SET @Query = ( SELECT

我需要创建一个存储过程,它将返回一个代码列表,然后我需要调用另一个存储过程来逐个检查每个代码

我该怎么做

CREATE PROCEDURE [dbo].[paBltBuscarBoletasASA] @id_Asa int  
AS
DECLARE @Query int, @Contador int 
SET @Contador = 0
BEGIN
      SET NOCOUNT ON;  
      SET @Query = (
                SELECT 
                    localizacion.c_Fk_IdBoleta
                FROM 
                    Blt_Boleta as boleta, Fnc_Localizacion as localizacion
                WHERE 
                    boleta.c_Pk_IdBoleta = localizacion.c_Fk_IdBoleta AND
                    localizacion.si_CodAsa = @id_Asa) //This query give the list of Codes. For example 45550711, 40480711, 80110711... etc

    exec dbo.paBltMarcarErroresBoleta @Query //And here I need send one by one that list of Codes
END

您可以考虑添加标量函数并在查询中调用它,例如:

SELECT 
    localizacion.c_Fk_IdBoleta,
    dbo.checkCode(localizacion.c_Fk_IdBoleta) as Check
FROM 
    Blt_Boleta as boleta, Fnc_Localizacion as localizacion
WHERE 
    boleta.c_Pk_IdBoleta = localizacion.c_Fk_IdBoleta AND
    localizacion.si_CodAsa = @id_Asa

为要设置为@query的查询声明一个游标,然后将WHILE@@FETCH\u STATUS=0循环中的每个后续值插入变量中。然后将@Query变量传递给第二个存储过程,就像您当前所做的那样。以下是一个例子:

DECLARE myCursor CURSOR FOR
SELECT localizacion.c_Fk_IdBoleta
FROM Blt_Boleta as boleta, Fnc_Localizacion as localizacion
WHERE boleta.c_Pk_IdBoleta = localizacion.c_Fk_IdBoleta AND 
localizacion.si_CodAsa = @id_Asa

OPEN myCursor

FETCH NEXT FROM myCursor INTO @Query

WHILE @@FETCH_STATUS = 0
BEGIN
    exec dbo.paBltMarcarErroresBoleta @Query
    //do additional processing

FETCH NEXT FROM myCursor INTO @Query
END

CLOSE myCursor
DEALLOCATE myCursor

其他光标帮助:

好的,现在如何将第二个SP的结果保存到临时表中?只需将
插入到#tentable EXEC dbo.paBltMarcarErroresBoleta@Query
。更多信息和选项可在此处找到其他问题,第二个SP返回一个包含5列的表(Description_Error,Id_Boleta,Name_Boleta,Cod_Asa,Cultivo),我需要在临时表中声明这些列,其思想是在CrystalReport中显示此表,但我需要知道这是否必要?当您声明表时,必须指明它将包含哪些列<代码>创建表#可诱惑(description#error varchar,id#boleta int,name#boleta varchar,cod#asa varchar,cultivo varchar)然后将插入更改为类似
插入#可诱惑(description#error,id#boleta,name#boleta,cod asa,cultivo)EXEC dbo.pabltmararerroresboleta@Query
。通过这种方式,它知道将返回的每个列粘贴到何处。我不确定这些列应该是什么类型的,所以我只是猜测。适当地改变这些。