Khai báo biến trong hàm có giá trị bảng


110

Làm cách nào để khai báo một biến trong một hàm có giá trị bảng? (như trong tiêu đề của tôi)


nội tuyến hay nhiều câu lệnh? Giống như MSDN mô tả chúng?
gbn

Câu trả lời:


205

Có hai hương vị của các hàm có giá trị bảng. Một chỉ là một câu lệnh select và một câu lệnh có thể có nhiều hàng hơn chỉ một câu lệnh select.

Điều này không thể có một biến:

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

Thay vào đó, bạn phải làm như thế này:

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

33
Ví dụ đầu tiên được biết đến như một "Chức năng Inline bảng giá trị" trong đó có lợi ích hiệu suất so với Multi-tuyên bố bảng giá trị chức năng, cụ thể là các máy chủ cơ sở dữ liệu có thể recompose truy vấn với ITVF inlined vào truy vấn phụ huynh, về cơ bản trở thành một parameterised VIEWtrong khi MSTVF hoạt động giống như một thủ tục lưu trữ không trong suốt hơn (mặc dù có những ưu điểm riêng của nó so với mầm). Các hàm nội tuyến nên được ưu tiên hơn MSTVF. Nếu bạn cần tính toán và lưu trữ các giá trị trung gian (chẳng hạn như kết quả của một biểu thức hàm vô hướng phức tạp) thì hãy sử dụng một truy vấn con.
Đài

1
Cũng cần nhắc lại rằng nếu kết quả của bất kỳ thứ gì bạn đang sử dụng để điền biến bạn muốn đặt theo bất kỳ cách nào có thể tổng quát hóa được, thì bạn có thể xem xét viết một hàm riêng để tạo ra nó. Điều này sẽ cho phép bạn sử dụng ITVF được @Dai mô tả ở trên, với tất cả các lợi ích của nó, trong khi vẫn chèn giá trị được tạo động vào hàm của bạn. Tôi vừa viết một hàm với sự trợ giúp của giải pháp trên (cảm ơn bạn @MikaelEriksson!). Hàm này sẽ chuyển một trong các tham số của nó cho hàm trợ giúp để giúp tôi không phải sử dụng biểu mẫu MSTVF.
naughtilus

1
chi phí lớn nhất là chèn cho chức năng của tôi và tôi không biết làm thế nào để bỏ qua chi phí này mà không cần chèn để biến bảng và trả kết quả của chọn
uzay95

@naughtilus, thật tuyệt khi xem một ví dụ về điều này. Bạn đã cân nhắc cung cấp một câu trả lời khác cùng với đề xuất của mình chưa?
Jacques
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.