#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.html3. Другой вопрос, второй 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
. Таким образом, он знает, куда вставлять каждый возвращаемый столбец. Я не был уверен, какого типа должны быть столбцы, поэтому я просто догадался. Измените их соответствующим образом.