9

Helo,Procedura przechowywana procedury przechowywanej serwera SQL

Moje pytanie dotyczy jednej procedury przechowywanej na serwerze SQL, która zwraca liczbę pól. Chcę zapisać wyniki tej procedury przechowywanej w zmiennej (skalar?) Innej przechowywanej procedury.

sp_My_Other_SP: 

CREATE PROCEDURE [dbo].sp_My_Other_SP 
@variable int OUTPUT -- The returned count 
AS 

BEGIN -- SP 

SET NOCOUNT ON; 

SET @SQL = "SELECT COUNT(*) FROM blah" 
EXEC(@SQL) 

END -- SP 

Obecnie nie podoba:

DECLARE @count int 

EXEC sp_My_Other_SP @count OUTPUT 

Potem używać go jak

IF (@count > 0) 
BEGIN 
... 
END 

jednak wyniki jego powrocie z drugiej procedury przechowywanej, a także głównych przechowywanych wyników procedury, która jest problem w mojej aplikacji .NET.

----------- 
NoColName 
----------- 
14 

----------- 
MyCol 
----------- 
abc 
cde 
efg 

(Powyżej jest próba reprezentacja zbiorów wyników zwracanych)

chciałbym wiedzieć, czy istnieje sposób, aby zapisać wyniki procedury przechowywanej w zmiennej, która nie ma również wyjście to.

Dzięki za pomoc.

+2

będziesz musiał pokazać nam więcej kodu, ponieważ twoje pytanie nie jest jasne. –

+0

Zgadzam się .. pokaż nam cały kontekst .. wywołanie "innego" zapisanego proc. – madcolor

+0

Problem polega na tym, że sproc, który zwraca liczbę, zawiera więcej w swoim zestawie wyników, a wynik ten pojawia się w drugim sproc. –

Odpowiedz

12

Możesz przechwycić wyniki procedury przechowywanej w tabeli tymczasowej, aby nie została zwrócona przez wywołanie procedury składowanej.

create table #temp (id int, val varchar(100)) 
insert into #temp 
exec sp_My_Other_SP @value, @value, @value, @count OUTPUT 
+2

kiedyś to podejście, ale zamiast tabeli mieszania kiedyś tabeli typów skalarnego jak: DECLARE @temp_tbl tabeli (wartości int) INSERT INTO @temp_tbl EXEC sp_My_SP \t \t \t SET @count = (SELECT TOP 1 value FROM @temp_tbl) – Phil

+0

Jest to oczywiście mniej efektywne, ponieważ wybierasz dane, których nie obchodzi. Lepiej byłoby dodać nowy parametr do sp_My_Other_SP, który kontroluje, czy zestaw wyników zostanie zwrócony, jeśli po prostu szukasz liczby. –

+0

To nie ma sensu, zależy mi na tym, jak będę go zawsze używał, a to jest istotne dla reszty SP. – Phil

4

Cóż, najłatwiejszym rozwiązaniem jest przekodowanie przechowywanego procesu tak, że instrukcja select, która zwraca "inny" zestaw wyników, którego nie chcemy w tym przypadku, jest warunkowo wykonywana, tylko jeśli NIE prosimy o liczba

Dodaj kolejny parametr zwany @GetCount

@GetCount TinyInt Defualt = 0 // or 
@GetCount Bit Default = 0 

Następnie zamiast tylko

Select ... 

zapisu

If @GetCount = 1 
    Select ... 
2

Czy próbowałeś zmieniając

SET @SQL = "SELECT COUNT(*) FROM blah" 
EXEC(@SQL) 

do

SELECT @variable = COUNT(*) FROM blah" 
-- don't do EXEC(@SQL) 

?

0
THE FIRST PROCEDURE: 
CREATE PROC DD43 
@ID INT OUTPUT AS 
(SELECT @ID=COUNT(*) FROM CS2) 

SECOND PROCEDURE: 

CREATE PROC DD45 AS 
DECLARE @COUNT INT 
DECLARE @COUN INT 
EXEC DD43 @COUN OUT --CALLING THE FIRST PROCEDURE 
SET @COUNT= (SELECT @COUN) 
SELECT @COUNT 

EXEC DD45 
+2

Podczas gdy ten kod może odpowiedzieć na pytanie, lepiej byłoby wyjaśnić, w jaki sposób rozwiązuje problem i dlaczego go używać. Odpowiedzi tylko na kod nie są przydatne na dłuższą metę. –

Powiązane problemy