SQL सर्वर में गणना किए गए स्तंभों की एक व्यापक रूप से ज्ञात सीमा यह है कि वे अन्य तालिकाओं से डेटा तक नहीं पहुंच सकते हैं। अर्थात्, आपका व्यंजक एक ही तालिका में स्तंभों का उपयोग कर सकता है, लेकिन अन्य तालिकाओं से नहीं।
लेकिन यह सिर्फ आधा सच है। जबकि आप किसी अन्य तालिका के कॉलम को सीधे अपनी अभिव्यक्ति में संदर्भित नहीं कर सकते, आप कर सकते हैं उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन का आह्वान करें। और इसलिए, आप एक उपयोगकर्ता-परिभाषित फ़ंक्शन बना सकते हैं जो आपके लिए आवश्यक गणना करता है, फिर बस उस फ़ंक्शन को अपने परिकलित कॉलम की अभिव्यक्ति के रूप में कॉल करें।
प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।
नमूना तालिकाएं
मेरे पास निम्न तालिकाओं वाला एक डेटाबेस है:
SELECT TOP(5) * FROM Artists; +------------+------------------+--------------+-------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | |------------+------------------+--------------+-------------| | 1 | Iron Maiden | 1975-12-25 | 3 | | 2 | AC/DC | 1973-01-11 | 2 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | | 4 | Buddy Rich | 1919-01-01 | 6 | | 5 | Devin Townsend | 1993-01-01 | 8 | +------------+------------------+--------------+-------------+ SELECT TOP(5) * FROM Albums; +-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
इन तालिकाओं में वास्तव में 5 से अधिक पंक्तियाँ होती हैं। मैंने शीर्ष 5 पंक्तियों का चयन किया है ताकि आपको डेटा और तालिका संरचना की तस्वीर मिल सके।
अब, कल्पना कीजिए कि मैं पहली तालिका में एक परिकलित कॉलम जोड़ना चाहता हूं।
मैं चाहता हूं कि गणना कॉलम प्रत्येक कलाकार से एल्बमों की संख्या प्रदान करे। दूसरे शब्दों में, मुझे दूसरी तालिका में एल्बमों की गणना करने की आवश्यकता है - Albums
टेबल।
यह देखते हुए कि डेटा किसी अन्य तालिका में है, मैं इसे सीधे गणना किए गए कॉलम से संदर्भित नहीं कर सकता। लेकिन मैं इसके बजाय एक उपयोगकर्ता-परिभाषित फ़ंक्शन बना सकता हूं, और उस फ़ंक्शन को मेरे परिकलित कॉलम के भीतर से संदर्भित कर सकता हूं।
फ़ंक्शन बनाएं
यहां एक सरल फ़ंक्शन दिया गया है जो किसी दिए गए कलाकार के एल्बमों की संख्या की गणना करता है:
CREATE FUNCTION [dbo].[ufn_AlbumCount] (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END; GO
गणना कॉलम बनाएं
अब जब मैंने फ़ंक्शन बना लिया है, तो मैं एक परिकलित कॉलम जोड़ सकता हूं जो इसका संदर्भ देता है।
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
गणना कॉलम का परीक्षण करें
अब मैं Artists
के विरुद्ध एक क्वेरी चला सकता हूं मेरे परिकलित कॉलम का परिणाम देखने के लिए तालिका:
SELECT TOP(10) * FROM Artists;
परिणाम:
+------------+------------------+--------------+-------------+--------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | AlbumCount | |------------+------------------+--------------+-------------+--------------| | 1 | Iron Maiden | 1975-12-25 | 3 | 5 | | 2 | AC/DC | 1973-01-11 | 2 | 3 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | 2 | | 4 | Buddy Rich | 1919-01-01 | 6 | 1 | | 5 | Devin Townsend | 1993-01-01 | 8 | 3 | | 6 | Jim Reeves | 1948-01-01 | 6 | 1 | | 7 | Tom Jones | 1963-01-01 | 4 | 3 | | 8 | Maroon 5 | 1994-01-01 | 6 | 0 | | 9 | The Script | 2001-01-01 | 5 | 1 | | 10 | Lit | 1988-06-26 | 6 | 0 | +------------+------------------+--------------+-------------+--------------+
अनुक्रमण
आप किसी अनुक्रमणिका में परिकलित स्तंभ का उपयोग केवल तभी कर सकते हैं, जब उपयोगकर्ता-परिभाषित फ़ंक्शन जिसे वह आमंत्रित करता है, उसमें निम्नलिखित गुण मान हों:
- नियतात्मक है =सच
- IsSystemVerified =सच (जब तक कि परिकलित कॉलम जारी न हो)
- UserDataAccess =झूठा
- SystemDataAccess =झूठा