Deklarasikan variabel dalam fungsi nilai tabel

111

Bagaimana cara mendeklarasikan variabel dalam fungsi nilai tabel? (seperti di judul saya)

esquare
sumber
inline atau multi-statement? Seperti MSDN menggambarkannya?
gbn

Jawaban:

207

Ada dua jenis fungsi nilai tabel. Satu yang hanya pernyataan pilih dan yang bisa memiliki lebih banyak baris daripada hanya pernyataan pilih.

Ini tidak boleh memiliki variabel:

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

Anda harus melakukan seperti ini:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end
Mikael Eriksson
sumber
34
Contoh pertama dikenal sebagai "Fungsi Inline Table-Valued" yang memiliki manfaat kinerja dibandingkan dengan Fungsi Table-Valued Multi-pernyataan, yaitu server database dapat Ubah komposisi query dengan ITVF inline ke dalam query orang tua, pada dasarnya menjadi parameterised VIEWsedangkan MSTVF berperilaku lebih seperti prosedur penyimpanan buram (meskipun dengan kelebihannya sendiri dibandingkan dengan sprocs). Fungsi sebaris harus lebih disukai daripada MSTVF. Jika Anda memang perlu menghitung dan menyimpan nilai antara (seperti hasil dari ekspresi fungsi skalar yang kompleks), gunakan subkueri.
Dai
1
Mungkin juga perlu disebutkan bahwa jika hasil dari apa pun yang Anda gunakan untuk mengisi variabel yang ingin Anda tetapkan dengan cara apa pun dapat digeneralisasikan, maka Anda dapat mempertimbangkan untuk menulis fungsi terpisah untuk menghasilkannya. Ini akan memungkinkan Anda untuk menggunakan ITVF yang dijelaskan oleh @Dai di atas, dengan semua manfaatnya, sambil tetap memasukkan nilai yang dihasilkan secara dinamis ke dalam fungsi Anda. Saya baru saja menulis fungsi dengan bantuan solusi di atas (terima kasih @MikaelEriksson!) Yang meneruskan salah satu parameternya ke fungsi pembantu untuk menyelamatkan saya karena harus menggunakan formulir MSTVF.
naughtilus
1
biaya terbesar adalah memasukkan fungsi saya dan saya tidak tahu cara melewati biaya ini tanpa memasukkan ke variabel tabel dan mengembalikan hasil pilih
uzay95
@naughtilus akan sangat bagus untuk melihat contoh ini. Sudahkah Anda mempertimbangkan untuk memberikan jawaban lain bersama dengan saran Anda?
Jacques