आप SQL फ़ंक्शन के भीतर से अस्थायी तालिकाओं तक नहीं पहुँच सकते। आपको अनिवार्य रूप से तालिका चर का उपयोग करने की आवश्यकता होगी:
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
संपादित करें
इस प्रश्न पर टिप्पणियों के आधार पर यहाँ मेरी सिफारिश है। आप किसी अन्य क्वेरी में किसी प्रक्रिया या तालिका-मूल्यवान फ़ंक्शन के परिणामों में शामिल होना चाहते हैं। मैं आपको दिखाऊंगा कि आप इसे कैसे कर सकते हैं फिर आप जिसे पसंद करते हैं उसे चुनें। मैं अपने एक स्कीमा से नमूना कोड का उपयोग करने जा रहा हूं, लेकिन आपको इसे अनुकूलित करने में सक्षम होना चाहिए। दोनों पहले संग्रहीत प्रक्रिया के साथ व्यवहार्य समाधान हैं।
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
इस मामले में, आपको प्रक्रिया के परिणामों को संग्रहीत करने के लिए एक अस्थायी तालिका या तालिका चर घोषित करना होगा। अब आइए देखें कि यदि आप UDF का उपयोग कर रहे होते तो आप यह कैसे करते
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
जैसा कि आप देख सकते हैं कि यूडीएफ पढ़ने में बहुत अधिक संक्षिप्त है, और शायद थोड़ा बेहतर प्रदर्शन करता है क्योंकि आप द्वितीयक अस्थायी तालिका का उपयोग नहीं कर रहे हैं (प्रदर्शन मेरी ओर से एक पूर्ण अनुमान है)।
यदि आप कई अन्य स्थानों पर अपने कार्य/प्रक्रिया का पुन:उपयोग करने जा रहे हैं, तो मुझे लगता है कि यूडीएफ आपकी सबसे अच्छी पसंद है। एकमात्र पकड़ यह है कि आपको #Temp तालिकाओं का उपयोग बंद करना होगा और तालिका चर का उपयोग करना होगा। जब तक आप अपनी अस्थायी तालिका को अनुक्रमित नहीं कर रहे हैं, तब तक कोई समस्या नहीं होनी चाहिए, और आप tempDb कम का उपयोग करेंगे क्योंकि तालिका चर स्मृति में रखे जाते हैं।