Вложенные хранимые процедуры

#sql #sql-server #sql-server-2008

#sql #sql-сервер #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 
                    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:

Вы можете рассмотреть возможность добавления скалярной функции и вызвать ее в своем запросе, например:

 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
 

Ответ №2:

Объявите КУРСОР для запроса, который вы устанавливаете равным @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

Комментарии:

1. Хорошо, теперь, как я могу сохранить результаты второго SP во временной таблице?

2. Просто сделайте INSERT INTO #tempTable EXEC dbo.paBltMarcarErroresBoleta @Query . Более подробную информацию и параметры можно найти здесь sommarskog.se/share_data.html

3. Другой вопрос, второй SP возвращает таблицу с 5 столбцами (Description_Error, Id_Boleta, Name_Boleta, Cod_Asa, Cultivo), мне нужно объявить эти столбцы во временной таблице?, Идея в том, чтобы показать эту таблицу в CrystalReport, но мне нужно знать, нужно ли это?

4. Когда вы объявляете таблицу, вы должны указать, какие столбцы в ней будут. CREATE TABLE #tempTable ( description_error varchar, id_boleta int, name_boleta varchar, cod_asa varchar, cultivo varchar) а затем измените вставку на что-то вроде INSERT INTO #tempTable (description_error, id_boleta, name_boleta, cod_asa, cultivo) EXEC dbo.paBltMarcarErroresBoleta @Query . Таким образом, он знает, куда вставлять каждый возвращаемый столбец. Я не был уверен, какого типа должны быть столбцы, поэтому я просто догадался. Измените их соответствующим образом.