2009-02-20 22 views
6

Bu değeri almak için gereken diğer saklı yordamlardan bir değer döndüren bir saklı yordamım var. Çağırma saklı yordam, bir işlemin içinde, değeri döndüren saklı yordam (ve aslında değeri oluşturur ve başka proc dokunmadığı bir tabloda saklar) kendi işleminin içinde değildir, ancak arayanın işleminin bir parçası olur.Depolanmış bir proc'nun döndürülen değerini SQL'de bir değişkene atamanın en iyi yolu nedir?

Sorun şu ki, saklı yordamın geri dönüş değerini almak ve arama procunda bir değişkende saklamak için en etkili yol hangisidir?

Şu anda aşağıdakiler var ve onun verimsiz olup olmadığını merak ediyorum?

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

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

Bunu yapmanın daha düz bir yolu yok mu? Bu pahalı (performans açısından) bir yol değil mi?

Kayıtlı proc'm bir çıkış parametresi yok, sadece bir değer döndürüyor. Bir çıkış parametresi kullanmak daha hızlı mı olur?

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

cevap

13

kullanıyorum Ne değer için

1 satır ve 1 sütun veya hiç satır kümesi ve sadece geri dönüş kodunu yakalamak ister misiniz? Eğer

Bu kodu

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 
+0

İlginç, o yapı geçerli olduğunu bilmiyordum. Yani verdiğim örnek bir geçici masa oluşturuyor. Ne kadar verimsiz olduğunu açıklar mısınız, yoksa on binlerce kez çağrılmadıkça fark edilmez mi? – ApplePieIsGood

+0

söylemek zor, tablonuz bir tablo değişkendir, bu yüzden hepsi bellekte olmalı. Neden sisteminizde bir test yapmıyorsanız, bu farkı ikiye ayırın? – JoshBerke

1

bu bir satır kümesi dönen proc mı: o senin evet bu yapabileceğiniz innefficent tek bir geri dönüş değişkeni alma ben MS SQL Server 2005

3

çalıştırmak ne anlama geldiğini açıklamak için şu anda ne yaptığını çok daha hızlı olacaktır sicne sadece dönüş kodu daha sonra aksi bir ÇIKIŞ parametresi kullanın Josh'un yöntemi kullanmak istiyorsanız

Bkz. How to Share Data Between Stored Procedures
Bazı nedenlerden dolayı 'exec @localVariable = GetMyValue' benim için çalışmıyor (MS SQL 2005), her zaman 0 değerini döndürür (They have the same issue).

Düşüncelerim:
Eğer saklı yordamı değiştirebilirseniz, çıktı parametresi ekleyin.
prosedürü kaldıramazsanız, bunu bir işlev olarak tekrar yazınız.
Diğerleri, tablo değişkenini, kullandığınız gibi kullanın.

+1

Proc içinde bir dönüş yoksa veya bir hata oluşmadıkça her zaman 0 olacaktır. – SQLMenace

+0

sağladığım kodu çalıştırın Sadece bir dönüş değeriyle ilgileniyorum. İstediğim tek şey bu dönüş değeri veya belirli bir değer elde etmek olduğunda Josh'un yöntemini bir çıkış parametresinden daha yavaş veya daha hızlı kullanacak (bu, bu proc içinde yarattığım bir getiri değeri olmak zorunda değil). Şu an yaptığım daha hızlı görünüyor. – ApplePieIsGood

+0

2SQLMenace - evet, haklısınız. geri dönüş ile çalışır. –

0

bu deneyin:

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] 
İlgili konular