2016-10-31 6 views
7

हम सभी जानते हैं कि SQL उपयोगकर्ता परिभाषित तालिका मूल्य तालिका प्रकार (यूडीटी) को आश्रित/निर्भरता होने पर नहीं छोड़ा जा सकता है। सही।एसक्यूएल उपयोगकर्ता परिभाषित तालिका प्रकार: यदि पैरामीटर के रूप में उपयोग नहीं किया जाता है तो हम उन्हें क्यों छोड़ सकते हैं?

लेकिन, आज मैंने एक को छोड़ दिया, भले ही उनके पास आश्रित हों। केवल मानदंड यह है कि उन्हें डीबी ऑब्जेक्ट्स जैसे प्रोसेस या फनक के पैरामीटर के रूप में उपयोग नहीं किया जाना चाहिए। के रूप में यह एक proc के अंदर इस्तेमाल और एक पैरामीटर नहीं है

CREATE TYPE FooUDT AS TABLE 
(
    ID int NOT NULL 
) 

निर्भर

CREATE PROCEDURE Bar 
as 
BEGIN 
    DECLARE @Identifier FooUDT 

    --Some operations on @Identifier 
END 
GO 

FooUDT छोड़ा जा सकता है। लेकिन इसके बाद इसे गिराया नहीं जा सकता है।

CREATE PROCEDURE Bar 
    @Identifier FooUDT readonly 
as 
BEGIN 
    --Some operations on @Identifier 
END 
GO 

अधिक रूचिकर है कि दोनों ही मामलों में, अगर हम निर्भरता जाँच, दोनों एक दूसरे नाम दिखाएगा है। फिर भी पूर्व मामले को छोड़ दिया जा सकता है लेकिन उत्तरार्द्ध नहीं। यह क्यों? या क्या मैं कुछ न कुछ भूल रहा हूं?

+3

टी-एसक्यूएल का सबसे बड़ा गलतफहमी जिसे [स्थगित नाम संकल्प] के रूप में जाना जाता है (https : //technet.microsoft.com/library/ms190686)। –

+1

@ जेरोमेनमोस्टर्ट: यूडीटी के साथ इसकी अलग-अलग। यदि यूडीटी गुम है और वाक्यविन्यास सही है, तो proc भी नहीं बनाया गया है। –

+2

मुझे पता था कि मुझे "स्थगित संकलन" को "स्थगित नाम समाधान" में नहीं बदला जाना चाहिए था। लेकिन विचार वही है: किसी भी चीज के लिए जो टेबल नहीं है, सिंटैक्स पार्स किया गया है और प्रक्रिया तब तक नहीं बनाई जाती जब तक कि सभी ऑब्जेक्ट मौजूद न हों। लेकिन फिर भी आप टी-एसक्यूएल शिकायत किए बिना उन वस्तुओं को छोड़ने के लिए स्वतंत्र हैं, क्योंकि संकलन अभी भी स्थगित है। स्थगित संकलन संग्रहीत प्रक्रिया के मेटाडेटा पर लागू नहीं होता है, केवल इसके कथन के लिए, यही कारण है कि यदि आप पैरामीटर के रूप में उपयोग किया जाता है तो आप यूडीटी को नहीं छोड़ सकते हैं। –

उत्तर

4

एसक्यूएल सर्वर संग्रहीत प्रक्रिया निकाय को पाठ के रूप में संग्रहीत करता है जो आपके DECLARE @Identifier FooUDT प्रक्रिया के शरीर में है।

Select text, * 
    from sysobjects A 
    JOIN syscomments B 
    On A.id = B.id   
    where xtype = 'P' 

पैरामीटर्स मेटाडेटा में संग्रहीत हैं। आप उन्हें समीक्षा कर सकते हैं इस प्रकार है ...

SELECT SCHEMA_NAME(SCHEMA_ID) AS[Schema], 
SO.name AS[ObjectName], 
SO.Type_Desc AS[ObjectType(UDF/SP)], 
P.parameter_id AS[ParameterID], 
P.name AS[ParameterName], 
TYPE_NAME(P.user_type_id) AS[ParameterDataType], 
P.max_length AS[ParameterMaxBytes], 
P.is_output AS[IsOutPutParameter] 
FROM sys.objects AS SO 
INNER JOIN sys.parameters AS P 
ON SO.OBJECT_ID = P.OBJECT_ID 
WHERE SO.OBJECT_ID IN(SELECT OBJECT_ID FROM sys.objects WHERE TYPE IN('P', 'FN')) 
ORDER BY[Schema], SO.name, P.parameter_id 

मैं दूसरों यहाँ झंकार करने देगा, लेकिन मेरा मानना ​​है कि आप काफी कुछ अद्यतन विसंगतियों और झरना में समस्याएं आ रही हैं, तो आप निर्भरता के लिए प्रक्रिया शरीर की जांच करने की कोशिश की।

2

माइकल बुलर के जवाब

केवल मानकों के आधार पर स्थान, ड्रॉप पर मान्य संग्रहीत procs या UDFs शरीर नहीं हैं कर रहे हैं; का कारण है कि यह शरीर को मान्य करने के व्यावहारिक नहीं होगा एक साधारण उदाहरण, एक अन्य कारण हर स्कीमा परिवर्तन पर सभी एस.पी./UDFs पुन: संयोजित करने की आवश्यकता होगी sp_execute_sql

https://msdn.microsoft.com/en-us/library/ms188001.aspx

के माध्यम से गतिशील एसक्यूएल का अस्तित्व। इसके बजाए, वे केवल मांग पर पुनर्निर्मित होते हैं, खासकर जब निर्मित या परिवर्तित होते हैं।

आप निर्भरताओं को देखते हैं क्योंकि उनकी गणना संकलन समय पर की जाती थी; लेकिन चूंकि परिवर्तनों में कमी आई हो सकती है, निर्भरताएं अपरिवर्तनीय रूप से अद्यतित नहीं हैं, और डीआरओपी को कोड के लिए काम करना चाहिए जो अब वैध नहीं है ...

संबंधित मुद्दे

 संबंधित मुद्दे