2009-02-20 14 views
6

Mam procedura składowana, która zwraca wartośćI wywołaj go z innych procedur przechowywanych, które muszą pobrać tę wartość. Wywołanie procedury składowanej odbywa się wewnątrz transakcji, procedura składowana, która zwraca wartość (i faktycznie tworzy wartość i przechowuje ją w tabeli, której nie dotyka żaden inny proces), ale nie jest częścią transakcji wywołującego.Jaki jest najlepszy sposób przypisania zwróconej wartości przechowywanego procesu do zmiennej w SQL?

Pytanie brzmi, jaki jest najskuteczniejszy sposób pobrania wartości zwracanej procedury przechowywanej i zapisania jej w zmiennej w procedurze wywołującej?

Obecnie mam następujące i zastanawiam się, czy jest to bardzo nieefektywne?

DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue EXEC GetMyValue 

DECLARE @localVariable int 
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue) 

Czy nie ma prostszej metody robienia tego? Czy nie jest to droga droga (pod względem wydajności)?

Moje zapisane proc nie ma parametrów wyjściowych, po prostu zwraca wartość. Czy użycie parametru wyjściowego byłoby szybsze?

Na co warto używam MS SQL Server 2005

Odpowiedz

13

Jeśli dostajesz jedną zmienną return to tak to innefficent można zrobić:

declare @localVariable int 
exec @localVariable =GetMyValue 
select @localVariable 
+0

Ciekawe, nie wiedziałem, że konstrukcja była ważna. Tak więc podałem przykład tworzenia tabeli tymczasowej. Jak mało wydajnie byś to opisał, czy nie byłby zauważalny, gdyby nie był nazywany dziesiątkami tysięcy razy? – ApplePieIsGood

+0

Trudno powiedzieć, że twoja tabela jest zmienną tabeli, więc wszystko powinno być w pamięci. Dlaczego nie uruchomić testu na swoim systemie zmierzyć różnicę z dwóch? – JoshBerke

1

Czy ta procuje powrocie zestaw wierszy z 1 wiersz i 1 kolumna lub brak zestawów wierszy i chcesz tylko przechwycić kod zwrotny?

Jeśli chcesz tylko returncode następnie użyć metody Josha inaczej użyć parametru wyjściowego sicne będzie znacznie szybciej niż to, co robisz teraz

wyjaśnić, co mam na myśli ten kod

use tempdb 
go 

create proc GetMyValue 
as 
select 1 
go 


create table #temp (id int) 
declare @localVariable int 

insert #temp 
exec @localVariable =GetMyValue 
select @localVariable,* from #temp 
3

Zobacz How to Share Data Between Stored Procedures Z pewnych powodów "exec @localVariable = GetMyValue" nie działa dla mnie (MS SQL 2005), to zawsze zwraca wartość 0 (They have the same issue).

Moja opinia:
jeśli możesz zmienić procedurę przechowywaną, dodaj parametr wyjściowy.
jeśli możesz usunąć procedurę, przepisuj ją ponownie jako funkcję.
else użyj zmiennej tabeli, tak jak Ty.

+1

Zawsze będzie 0, chyba że masz zwrot w proc lub wystąpi błąd, uruchom podany kod – SQLMenace

+0

Jestem zainteresowany tylko wartością zwracaną. Czy użycie metody Josh będzie wolniejsze, czy szybsze niż parametr wyjściowy, gdy wszystko, czego chcę, to uzyskanie wartości zwracanej lub określonej wartości (nie musi to być wartość zwracana, tylko wartość, którą utworzyłem w tym procesie). Wydaje się, że albo jest szybszy, co obecnie robię. – ApplePieIsGood

+0

2SQLMenace - tak, masz rację. działa z powrotem. –

0

Spróbuj tego:

create proc AvilableSeats 
as 
declare @v1 int,@v2 int 
exec @v1= determinPath_Capacity 1,'Sat-Tue',32 
exec @v2=Student_fGroup '6/12/2009' 
select @[email protected] 
Powiązane problemy