Tablo değerli fonksiyonda değişken bildirme


Yanıtlar:


207

Tablo değerli işlevlerin iki çeşidi vardır. Yalnızca bir select ifadesi olan ve bir select ifadesinden daha fazla satıra sahip olabilen biri.

Bunun bir değişkeni olamaz:

create function Func() returns table
as
return
select 10 as ColName

Bunun yerine şunu yapmalısın:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end

34
İlk örnek, bir Çokluifade Tablo Değerli Fonksiyonu, yani veritabanı sunucusu olabilir kıyasla performans faydaları vardır bir "satır içi Tablo Değerli Fonksiyonu" olarak bilinir recompose ITVF ile sorgu inlined ebeveyn sorgusu halinde, esasen parametrik olma VIEWoysa bir MSTVF daha çok opak bir saklı yordam gibi davranır (gerçi zincir dişlilerine kıyasla kendi avantajları vardır). Satır içi işlevler, MSTVF'ye tercih edilmelidir. Ara değerleri hesaplamanız ve saklamanız gerekiyorsa (karmaşık bir skaler işlev ifadesinin sonucu gibi), bir alt sorgu kullanın.
Dai

1
Ayarlamak istediğiniz değişkeni doldurmak için kullandığınız her şeyin sonucu herhangi bir şekilde genelleştirilebilirse, onu oluşturmak için ayrı bir işlev yazmayı düşünebilirsiniz. Bu, yukarıda @Dai tarafından açıklanan ITVF'yi tüm avantajlarıyla birlikte kullanmanıza izin verirken, yine de işlevinize dinamik olarak oluşturulmuş bir değer eklemenize olanak tanır. Sadece yukarıdaki çözümün yardımıyla (teşekkür ederim @MikaelEriksson!) Bir fonksiyon yazdım ve bu fonksiyon beni MSTVF formunu kullanmak zorunda kalmadan kurtarmak için parametrelerinden birini bir yardımcı fonksiyona aktarıyor.
naughtilus

1
en büyük maliyet fonksiyonum için ekleme yapmak ve bu maliyeti tablo değişkenine eklemeden ve select sonucunu döndürmeden nasıl atlayacağımı bilmiyorum
uzay95

@naughtilus bunun bir örneğini görmek harika olur. Önerinizle birlikte başka bir cevap vermeyi düşündünüz mü?
Jacques
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.