একটি টেবিলের মূল্যবান ফাংশন সহ কোনও টেবিলে কীভাবে যোগদান করবেন?


53

আমার একটি ব্যবহারকারীর সংজ্ঞায়িত ফাংশন রয়েছে:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end

এখন আমি এটির মতো অন্য টেবিলে যোগ দিতে চাই:

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1

অন্য কথায়, সব জন্য Fooরেকর্ড যেখানে SomeCriterion1, আমি দেখতে চাই Foo IDএবং Descমান পাশাপাশি, Field1এবং Field2যে থেকে ফিরিয়ে আনা হয় ut_FooFuncএকজন ইনপুট জন্য Foo.ID

এটি করার বাক্য গঠন কী?

উত্তর:


84

আপনার CROSS APPLYযোগদানের দরকার নেই।

যোগদানের সাথে যুক্ত টেবিল এক্সপ্রেশনগুলির সংজ্ঞাটি অবশ্যই স্থিতিশীল হতে হবে। উদাহরণস্বরূপ: এগুলি এ জাতীয় সম্পর্কযুক্ত হতে পারে না যে টেবিলের অভিব্যক্তিটির অর্থ অন্য টেবিলে একটি সারির মানের উপর নির্ভরশীল কিছু ভিন্ন।

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
Cross apply ut_FooFunc(f.ID, 1) u
where f.SomeCriterion = ...

0

আমি জানি যে থ্রেডটি পুরানো, আমাকে একই প্রশ্ন জিজ্ঞাসা করা হয়েছিল, আমি একটি পরীক্ষা করেছি, ফলাফলটি নিম্নরূপ ...

ফ্যাকরুকেন্সিআরটে রেকর্ডগুলি = 14264 যখন টেস্টফংশনটি 105 টি স্বতন্ত্রভাবে কার্যকর করা হয় তা প্রদান করে।

    SELECT F.*, x.CurrencyKey, x.CurrencyName
    FROM ( 
           SELECT CurrencyKey, CurrencyName FROM dbo.TestFunction()
        ) x
    INNER JOIN [dbo].[FactCurrencyRate] F ON x.CurrencyKey = f.CurrencyKey;

ফাঁসির সময়টি ...

    (14264 rows affected)
    Table 'FactCurrencyRate'. Scan count 1, logical reads 75, physical reads 1, read-ahead reads 73, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DimCurrency'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 31 ms,  elapsed time = 749 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

যদি আমি প্রস্তাবিত উত্তরটি নিম্নরূপ ব্যবহার করি ...

select F.*, x.CurrencyKey, x.CurrencyName from [dbo].[FactCurrencyRate] F
cross apply dbo.TestFunction() x

কার্যকর করার সময় এবং ফলাফল গণনা হয় ...

(1497720 rows affected)
Table 'FactCurrencyRate'. Scan count 1, logical reads 75, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 38110, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DimCurrency'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 2106 ms,  elapsed time = 43242 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

আমি এখানে যা দেখছি তা হ'ল অভ্যন্তরীণ ক্যোয়ারী ফলাফলের আরও সঠিক সেট এনেছে এবং কার্যকর করার সময়টি আরও কার্যকর। এটি সম্পাদন করার জন্য আরও ভাল পদ্ধতির সাথে আমাকে সংশোধন করুন!


1
প্রতিটি বাইরের সারিতে ক্রস প্রয়োগ প্রয়োগ করা হয় (সারি সারি সারি), এটি বিশেষত বৃহত্তর ডেটাসেটে এতটা ধীর হয়। এটির বিপরীতকরণের মাধ্যমে (কারণ আপনি কেবল টিভিএফ-তে একটি মিল রয়েছে এমন ফলাফল চান) তবে আপনি এক্সটেকশনের সময়কে (যে কোনও কল দেয় না) পাশাপাশি আপনি কত সারি ফিরে পেয়েছেন তা হ্রাস করে But তবে আপনার দুটি বিবৃতি দ্বিতীয়টির সমতুল্য নয় প্রথমের চেয়ে অনেক বেশি সারি ফিরিয়ে দেয় correct যতদূর যথার্থতা যায় এটি আপনার ব্যবসায়ের প্রয়োজনীয়তার উপর নির্ভর করে
জোনাথন ফাইট

হ্যা আমি রাজি. তবে, আমি প্রাথমিক প্রশ্নের আলোকে কোডটি লিখেছিলাম যেখানে আমি ধরে নিয়েছিলাম যে টেবিলগুলির মধ্যে অনেকগুলি সম্পর্কের মধ্যে একটি রয়েছে। এবং দ্বিতীয়ত, আমাকে একটি সাক্ষাত্কারে একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল। ধন্যবাদ
ব্যবহারকারীর 10104116
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.