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
。通过这种方式,它知道将返回的每个列粘贴到何处。我不确定这些列应该是什么类型的,所以我只是猜测。适当地改变这些。