2011-10-26 62 views
0

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

我该怎么做?

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 

回答

-1

声明您所设置等于@Query查询光标,然后插入在WHILE @@ FETCH_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 

其它游标的帮助:http://msdn.microsoft.com/en-us/library/ms180169.aspx

+0

好了,现在,我怎么救第二个SP的结果在时间的表? – ale

+0

只要执行'INSERT INTO #tempTable EXEC dbo.paBltMarcarErroresBoleta @ Query'。更多的信息和选项可以在这里找到http://www.sommarskog.se/share_data.html –

+0

其他问题,第二个SP返回一个表格有5列(Description_Error,Id_Boleta,Name_Boleta,Cod_Asa,Cultivo),我需要声明这个时态表中的列?,这个想法是在CrystalReport中显示这个表,但是我需要知道这是否需要? – ale

1

也可以考虑添加一个标量函数,并调用它在您的查询,如:

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