2010-03-22 15 views
122

मेरे पास उपयोगकर्ता द्वारा परिभाषित तालिका प्रकार है। मैं OBJECT_ID(name, type) फ़ंक्शन का उपयोग करके पैच में संपादन करने से पहले इसका अस्तित्व जांचना चाहता हूं।SQL सर्वर 2008 में उपयोगकर्ता-परिभाषित तालिका प्रकार के अस्तित्व की जांच कैसे करें?

enumeration से उपयोगकर्ता परिभाषित तालिका प्रकारों के लिए पारित किया जाना चाहिए?

N'U' उपयोगकर्ता परिभाषित तालिका काम नहीं करता है के लिए की तरह है, यानी IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

उत्तर

134

आप sys.types में देख सकते हैं या TYPE_ID उपयोग कर सकते हैं:

IF TYPE_ID(N'MyType') IS NULL ... 

बस एक एहतियात: का उपयोग कर type_id कि सत्यापित नहीं होगा प्रकार तालिका प्रकार - बस उस नाम से एक प्रकार मौजूद है। अन्यथा जीबीएन की क्वेरी शायद बेहतर है।

+0

मैं भोलेपन 'करने के लिए यदि object_id (N'MyType ',' टीटी ') कोई सफलता के साथ NULL' है, लेकिन अपने समाधान काम कोशिश कर रहा था। –

+1

'टीटी' गणना केवल एसक्यूएल सर्वर 2012 या बाद में काम करती है (जैसा कि मैंने अभी पाया है) – Iain

+2

@Iain यह वास्तव में अभी भी नहीं है। आप किसी तालिका प्रकार को नाम से खोजने के लिए OBJECT_ID का उपयोग नहीं कर सकते - sys.objects से 'चयन नाम देखें, जहां टाइप =' टीटी ' – NReilingh

90
IF EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = 'MyType') 
    --stuff 

sys.types ... वे नहीं हैं स्कीमा-दायरे वाले वस्तुओं इसलिए में sys.objects

अद्यतन नहीं किया जाएगा, मार्च 2013

आप TYPE_ID भी

+2

मेरा मानना ​​है कि आपकी दूसरी टिप्पणी गलत है। अगर मुझे गलत नहीं लगता है, तो उपयोगकर्ता-परिभाषित प्रकार वास्तव में स्कीमा-स्कोप्ड हैं ('Schema_ID' वास्तव में [sys.types] में विशेषताओं में से एक है (http://msdn.microsoft.com/en-us/ पुस्तकालय/ms188021.aspx) तालिका से जुड़ा हुआ है, यही कारण है कि उन्हें [डीबीओ] के रूप में संदर्भित किया जा सकता है। [myUDType])। फिर भी, आप सही हैं कि यूडी प्रकार sys.objects में सूचीबद्ध नहीं हैं, और इसलिए OBJECT_ID() द्वारा उपलब्ध नहीं है। (किसी भी कारण से, sys.objects स्कीमा-स्कोप्ड ऑब्जेक्ट्स की एक विस्तृत सूची नहीं है।) – kmote

+1

@kmote - वे सीधे 'sys.objects' में सूचीबद्ध नहीं हैं लेकिन [इनमें से प्रत्येक के लिए एक पंक्ति है] (http : //stackoverflow.com/a/20483910/73226) –

11
IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'Person' AND is_table_type = 1 AND SCHEMA_ID('VAB') = schema_id) 
DROP TYPE VAB.Person; 
go 
CREATE TYPE VAB.Person AS TABLE 
( PersonID    INT 
    ,FirstName    VARCHAR(255) 
    ,MiddleName    VARCHAR(255) 
    ,LastName    VARCHAR(255) 
    ,PreferredName   VARCHAR(255) 
); 
5

उपयोग कर सकते हैं निम्नलिखित उदाहरण मेरे लिए काम करते हैं, कृपया ध्यान दें "is_user_defined" नहीं "is_table_type"

IF TYPE_ID(N'idType') IS NULL 
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL 
go 

IF not EXISTS (SELECT * FROM sys.types WHERE is_user_defined = 1 AND name = 'idType') 
CREATE TYPE [dbo].[idType] FROM Bigint NOT NULL 
go 
2

आप उपयोग कर सकते हैं भी प्रणाली table_types देखने

IF EXISTS (SELECT * 
      FROM [sys].[table_types] 
      WHERE user_type_id = Type_id(N'[dbo].[UdTableType]')) 
    BEGIN 
     PRINT 'EXISTS' 
    END 
संबंधित मुद्दे