2011-07-12 29 views
74

Làm cách nào để khai báo biến trong hàm bảng có giá trị?Khai báo biến trong hàm có giá trị bảng

+0

inline hoặc đa tuyên bố? Giống như * MSDN * mô tả chúng? – gbn

+9

@YogeshBhadauirya Vấn đề với câu trả lời "sử dụng công cụ tìm kiếm" vô lý là * điều này * là nơi các điểm của công cụ tìm kiếm. Loại tình huống đệ quy vô hạn. Tốt nhất là xóa trang hoặc chỉ trả lời câu hỏi. – Volvox

+24

Câu hỏi này xứng đáng được yêu thích hơn: được mở lại và câu trả lời dưới đây được chấp nhận. Nó thực sự * là * một câu hỏi thực sự. – Askolein

Trả lời

136

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

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

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

Bạn phải làm như thay vì điều 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 
+1

Cảm ơn, điều này rất hữu ích –

+13

Ví dụ đầu tiên được gọi là "Chức năng bảng giá trị nội tuyến" có lợi ích về hiệu suất so với chức năng Bảng báo giá nhiều lần, cụ thể là máy chủ cơ sở dữ liệu có thể * phân phối lại * truy vấn với ITVF * inlined * vào truy vấn cha, về cơ bản trở thành một tham số 'VIEW' trong khi một MSTVF hoạt động giống như một thủ tục lưu trữ mờ (mặc dù có những ưu điểm riêng so với sprocs). Các chức năng 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 biểu thức hàm vô hướng phức tạp) thì hãy sử dụng truy vấn phụ. – Dai

+0

Có lẽ cũng đáng nói rằng nếu kết quả của bất cứ điều gì bạn đang sử dụng để điền biến bạn muốn đặt là theo bất kỳ cách nào chung, thì bạn có thể xem xét viết một hàm riêng biệt để tạo ra nó. Điều này sẽ cho phép bạn sử dụng ITVF được mô tả bởi @Dai ở trên, với tất cả các lợi ích của chúng, 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!), Nó chuyển một trong các tham số của nó đến một hàm trợ giúp để lưu tôi phải sử dụng biểu mẫu MSTVF. – naughtilus

Các vấn đề liên quan