SQL सर्वर - जहां "sys.functions" है?


104

SQL सर्वर 2005 में सिस्टम कैटलॉग पर महान sys.XXX विचार हैं जो मैं अक्सर उपयोग करता हूं।

जो मुझे ठगता है वह यह है: आपके संग्रहीत कार्यविधियों के बारे में जानकारी देखने के लिए "sys.procedures" दृश्य क्यों है, लेकिन आपके संग्रहीत कार्यों के लिए समान देखने के लिए कोई "sys.functions" दृश्य नहीं है?

क्या कोई संग्रहीत कार्यों का उपयोग नहीं करता है? मैं उन्हें उदाहरण के लिए गणना किए गए कॉलम और इस तरह के लिए बहुत आसान लगता हूं!

वहाँ एक विशेष कारण है sys.functions याद आ रही है, या यह सिर्फ कुछ है जो महत्वपूर्ण नहीं माना गया था ताकि सूचीपत्र में डाल दिया जाए ?? क्या यह SQL Server 2008 में उपलब्ध है ??

चीयर्स, मार्क


TimC द्वारा प्रदान किया गया उत्तर (14 जनवरी को 22 जनवरी को दिया गया) पुराने sysobjects सिस्टम टेबल का उपयोग करने पर पसंद किया जाता है, क्योंकि आपको INFORMATION_SCHEMA.ROUTINES में LAST_ALTERED कॉलम मिला है जो sys.tables में मौजूद संशोधित_डेट कॉलम के समान है। sys.views, sys.procedures, आदि। हालाँकि, यदि आप अधिक अपडेट किए गए sys.objects सिस्टम दृश्य का उपयोग कर रहे हैं, तो आपके पास उन तालिकाओं के रूप में rev_date हैं। मेरी $ 0.02। चीयर्स, -मैथ्यू
माशू

1
@JuniorMayhe: ठीक है - यहाँ कनेक्ट सुझाव प्रतिक्रिया है जो मैंने दर्ज की है - इसे बढ़ाएँ! :-)
marc_s

1
मुझे लगता है कि @marc_s के पास एक अच्छा बिंदु है: बहुत से लोग यह नहीं समझ सकते कि क्यों नहीं है sys.functions। आपके पास है sys.foreign_keysऔर नहीं sys.primary_keys। वैसे भी, मैं अपने आप को एसक्यूएल सर्वर के संस्करणों आगामी के लिए लोगों को पूछने के माइक्रोसॉफ्ट के खुले चैनल का उपयोग करने का प्रस्ताव करने और नई विशेषताएं सुझाएं connect.microsoft.com/SQLServer/Feedback मैं पहले से ही पर sys.functions के बारे में एक प्रतिक्रिया को शामिल किया है connect.microsoft.com/ SQLServer / प्रतिक्रिया / विवरण / 1127920
जूनियर मेहे

जवाबों:


117

मुझे लगता है कि यूडीएफ बहुत उपयोगी हैं और मैं हर समय उनका उपयोग करता हूं।

मुझे यकीन नहीं है कि SQL सर्वर 2005 (या SQL सर्वर 2008, जहाँ तक मैं बता सकता हूँ) में समतुल्य sys.functions को शामिल नहीं करने के लिए Microsoft का औचित्य क्या है, लेकिन यह अपना रोल करने के लिए काफी आसान है:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

7
इसमें सीएलआर फ़ंक्शन प्रकार भी शामिल होना चाहिए: 'एएफ', 'एफएस' और 'एफटी'। यहां देखें sys.objects "टाइप" कॉलम विवरण: msdn.microsoft.com/en-us/library/ms190324.aspx
Triynko

4
SQL सर्वर ऑब्जेक्ट मेटाडेटा के संदर्भ में "AF" को "फ़ंक्शन" नहीं माना जाता है, भले ही यह AGGREGATE_FUNCTION के लिए खड़ा हो। यह अधिक स्पष्ट है कि एक एग्रीगेट अन्य उपयोगकर्ता द्वारा परिभाषित कार्यों से अलग एक ऑब्जेक्ट प्रकार है जब आप यह सोचते हैं कि आप क्रिएट फंक्शन के बजाय क्रिएट एजग्रेट का उपयोग करके एक नया एग्रीगेट बनाते हैं। ऑब्जेक्ट प्रकार 'एफएन', 'आईएफ', 'टीएफ', 'एफएस' और 'एफटी' पांच फ़ंक्शन प्रकार हैं जो एसएसएमएस (एसएमओ के माध्यम से) अगर आईएफआईएसटीएस ... DROP FUNCTION कोड स्क्रिप्टिंग करते समय उत्पन्न होते हैं।
ऑरलैंडो कोलामेटो

37

फ़ंक्शन को सूचीबद्ध करने का दूसरा तरीका है INFORMATION_SCHEMA दृश्यों का उपयोग करना।

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'

Microsoft वेब साइट के अनुसार "सूचना स्कीमा दृश्य SQL सर्वर मेटाडेटा का आंतरिक, सिस्टम टेबल-स्वतंत्र दृश्य प्रदान करते हैं। सूचना स्कीमा दृश्य अनुप्रयोगों को सही ढंग से काम करने में सक्षम बनाता है, हालांकि अंतर्निहित सिस्टम तालिकाओं में महत्वपूर्ण परिवर्तन किए गए हैं"। दूसरे शब्दों में, अंतर्निहित सिस्टम टेबल बदल सकते हैं क्योंकि एसक्यूएल अपग्रेड हो जाता है, लेकिन विचार अभी भी समान होना चाहिए।


हां, धन्यवाद, मुझे INFORMATION_SCHEMA भी पता है - लेकिन एक लंबे समय के उपयोगकर्ता के रूप में, sys.xxxx अभी भी आसान है - अनुस्मारक के लिए धन्यवाद!
marc_s

4
INFORMATION_SCHEMA बहुत अच्छा होगा, लेकिन इसमें बड़ी प्रक्रियाओं की पूरी बॉडी शामिल नहीं है - जो आपको शरीर में खोज करने पर बेकार से कम बनाता है। यह वह नहीं है जो आप नहीं जानते हैं कि आप मुसीबत में
पड़ेंगे

3
Information_Schema विचार स्पष्ट रूप से कुछ चीजों के लिए विश्वसनीय नहीं होने के रूप में प्रलेखित हैं। जैसे "किसी ऑब्जेक्ट का स्कीमा निर्धारित करने के लिए INFORMATION_SCHEMA दृश्यों का उपयोग न करें। किसी ऑब्जेक्ट का स्कीमा खोजने का एकमात्र विश्वसनीय तरीका sys.objects कैटलॉग दृश्य को क्वेरी करना है।" msdn.microsoft-en-us/library/
डेविड ईसन

मुझे यह उत्तर पसंद है, क्योंकि INFORMATION_SCHEMAक्वेरी बहुत ही दिलचस्प परिणाम देती है जैसे IS_DETERMINISTIC(जो मुझे पता लगाना था)।
टॉमस गैंडर

18

जब आप किसी फ़ंक्शन का DROP स्क्रिप्ट करते हैं, तो यह SSMS के प्रति 2008 R2 में मान्य होता है:

SELECT  *
FROM    sys.objects
WHERE   type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ;

/*
From http://msdn.microsoft.com/en-us/library/ms177596.aspx:
 FN SQL_SCALAR_FUNCTION
 FS Assembly (CLR) scalar-function
 FT Assembly (CLR) table-valued function
 IF SQL_INLINE_TABLE_VALUED_FUNCTION
 TF SQL_TABLE_VALUED_FUNCTION
*/

1
आपका संपादित सुझाव एक टिप्पणी होना चाहिए, एक संपादन नहीं। "AF एग्रीगेट फंक्शन" स्पष्ट रूप से एमएस डॉक्यूमेंटेशन (लिंक की जांच करें) से है, इसलिए यह पोस्ट पूरी तरह से सही लगती है। यदि आप असहमत हैं: टिप्पणी करें । नोट किया गया। अगर लोगों को बार-बार अपने संपादन अस्वीकार कर दिया है कि यह एक संकेत होना चाहिए कि आप शायद कुछ गलत कर रहे हैं, और नहीं अन्य लोगों को।
मार्टिन टूरनोइज

SQL सर्वर ऑब्जेक्ट मेटाडेटा के संदर्भ में @Carpetsmoker "AF" को "फ़ंक्शन" नहीं माना जाता है, भले ही यह AGGREGATE_FUNCTION के लिए खड़ा हो। यह अधिक स्पष्ट है कि एक एग्रीगेट अन्य उपयोगकर्ता द्वारा परिभाषित कार्यों से अलग एक ऑब्जेक्ट प्रकार है जब आप यह सोचते हैं कि आप क्रिएट फंक्शन के बजाय क्रिएट एजग्रेट का उपयोग करके एक नया एग्रीगेट बनाते हैं। ऑब्जेक्ट प्रकार 'एफएन', 'आईएफ', 'टीएफ', 'एफएस' और 'एफटी' पांच फ़ंक्शन प्रकार हैं जो एसएसएमएस (एसएमओ के माध्यम से) अगर आईएफआईएसटीएस ... DROP FUNCTION कोड स्क्रिप्टिंग करते समय उत्पन्न होते हैं। SQL सर्वर फ़ंक्शन प्रकारों की सूची में AF के गलत जोड़ को वापस करने के लिए आपको मेरा संपादन स्वीकार करना चाहिए।
ऑरलैंडो कोलामेटो

5

यह बहुत अधिक क्रियात्मक है, लेकिन यह बिल्कुल उसी तरह करना चाहिए:

select * from sys.objects where (type='TF' or type='FN')

जहाँ तक मैं देख सकता हूँ, यह SQL Server 2008 में भी नहीं है।


1
हां, यही कि मैंने मूल रूप से खुद को "sys_functions" दृश्य बनाने के लिए किया था :-) बस सोच रहा था कि यह उत्पाद बॉक्स से बाहर क्यों नहीं है ....
marc_s

4

यह कुछ नया नहीं जोड़ता है, लेकिन मुझे याद रखने के लिए निम्नलिखित आसान मिला:

select * from sys.objects where type_desc like '%fun%'

यदि आप कोड, XML या डेटा नमूने पोस्ट करते हैं, तो कृपया टेक्स्ट एडिटर में उन लाइनों को हाइलाइट करें और { }संपादक टूलबार पर "कोड सैंपल" बटन ( ) पर क्लिक करके अच्छी तरह से फॉर्मेट करें और सिंटैक्स इसे हाइलाइट करें!
मार्च_

धन्यवाद, लेकिन मैं sys.objectsजितना हो सकता है उतना "है-इट-ऑल" से बचने की कोशिश करता हूं।
मार्च_


2

संयोग से, क्या आप प्रकार = 'FS' को शामिल नहीं करना चाहेंगे?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

यह वही है जो sys.objects में आइटम मेरे UDF के लिए मेल खाता है जो बाहरी DLL से लिया गया है


2

@ ल्यूक के जवाब पर विस्तार करने के लिए, फ़ंक्शन परिभाषाओं को वापस करने के लिए sys.sql_modulesतालिका में शामिल होने की आवश्यकता है । तो इसके लिए क्वेरी है:

SELECT O.name as 'Function name', M.definition as 'Definition', O.object_id
FROM sys.objects as O INNER JOIN sys.sql_modules as M
    ON O.object_id = M.object_id
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

जहां ऊपर क्रमशः फ़ंक्शन नाम, उसकी परिभाषा और ऑब्जेक्ट पहचानकर्ता प्रदर्शित करता है।


2

मालिक और वापसी प्रकार सहित अदिश कार्यों के पूर्ण विवरण के लिए:

SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition
FROM sys.objects f
JOIN sys.schemas s on s.schema_id = f.schema_id
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0
JOIN sys.types t ON t.system_type_id = p.system_type_id 
JOIN sys.sql_modules as m ON m.object_id = f.object_id
WHERE type='FN';

0

SQL 2000 ऑब्जेक्ट नाम के लिए विशिष्ट, मामूली समायोजन:

SELECT *
FROM sysobjects
WHERE type IN ('FN', 'IF', 'TF')

या

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.