Bạn không thể truy cập Bảng tạm thời từ bên trong Hàm SQL. Về cơ bản, bạn sẽ cần sử dụng các biến bảng:
ALTER FUNCTION FnGetCompanyIdWithCategories()
RETURNS @rtnTable TABLE
(
-- columns returned by the function
ID UNIQUEIDENTIFIER NOT NULL,
Name nvarchar(255) NOT NULL
)
AS
BEGIN
DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)
insert into @myTable
select from your stuff
--This select returns data
insert into @rtnTable
SELECT ID, name FROM @mytable
return
END
Chỉnh sửa
Dựa trên nhận xét cho câu hỏi này, đây là khuyến nghị của tôi. Bạn muốn nối kết quả của một thủ tục hoặc hàm có giá trị bảng trong một truy vấn khác. Tôi sẽ chỉ cho bạn cách bạn có thể làm điều đó sau đó bạn chọn một trong những bạn thích. Tôi sẽ sử dụng mã mẫu từ một trong các lược đồ của mình, nhưng bạn có thể điều chỉnh nó. Cả hai đều là những giải pháp khả thi trước hết với một quy trình được lưu trữ.
declare @table as table (id int, name nvarchar(50),templateid int,account nvarchar(50))
insert into @table
execute industry_getall
select *
from @table
inner join [user]
on account=[user].loginname
Trong trường hợp này, bạn phải khai báo một bảng tạm thời hoặc một biến bảng để lưu trữ kết quả của thủ tục. Bây giờ, hãy xem bạn sẽ thực hiện việc này như thế nào nếu bạn đang sử dụng UDF
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Như bạn có thể thấy, UDF dễ đọc ngắn gọn hơn rất nhiều và có thể hoạt động tốt hơn một chút vì bạn không sử dụng bảng tạm thời phụ (hiệu suất hoàn toàn là do tôi đoán).
Nếu bạn định sử dụng lại hàm / thủ tục của mình ở nhiều nơi khác, tôi nghĩ UDF là lựa chọn tốt nhất của bạn. Cách duy nhất là bạn sẽ phải ngừng sử dụng bảng #Temp và sử dụng các biến bảng. Trừ khi bạn đang lập chỉ mục bảng tạm thời của mình, sẽ không có vấn đề gì và bạn sẽ sử dụng tempDb ít hơn vì các biến bảng được lưu trong bộ nhớ.