SQL Server 2008 में उपयोगकर्ता-परिभाषित तालिका प्रकार के अस्तित्व की जांच कैसे करें?


164

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

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

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

जवाबों:


188

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

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

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


मैं भोलेपन IF OBJECT_ID(N'MyType', 'TT') IS NULLसे बिना किसी सफलता के कोशिश कर रहा था , लेकिन आपका समाधान काम कर गया।
एलन ग्रेलनक

1
'टीटी' एन्यूमरेशन केवल sql सर्वर 2012 में या बाद में काम करता है (जैसा कि मुझे अभी पता चला है)
Iain

3
@ यह अभी भी नहीं है, वास्तव में। आप नाम से तालिका प्रकार की खोज करने के लिए SELECT name FROM sys.objects WHERE type = 'TT'
OBJECT_ID का

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

sys.types ... वे स्कीमा- स्कोप्ड ऑब्जेक्ट नहीं हैं इसलिए sys.objects में नहीं होंगे

अपडेट, मार्च २०१३

आप TYPE_ID का भी उपयोग कर सकते हैं


5
मेरा मानना ​​है कि आपकी दूसरी टिप्पणी गलत है। अगर मैं गलत नहीं हूँ, तो यूज़र-डिफ़ाइंड टाइप वास्तव में स्कीमा-स्कोपेड हैं (यह Schema_IDवास्तव में आपके द्वारा लिंक की गई sys.types टेबल में मौजूद विशेषताओं में से एक है; इस कारण उन्हें [dbo] के रूप में संदर्भित किया जा सकता है। )। फिर भी, आप सही हैं कि UD प्रकार sys.objects में सूचीबद्ध नहीं हैं, और इसलिए OBJECT_ID () द्वारा सुलभ नहीं हैं। (जो भी कारण के लिए, sys.objects स्कीमा-स्कोप की गई वस्तुओं की एक विस्तृत सूची नहीं है।)
kmote

1
@kmote - वे sys.objectsसीधे सूचीबद्ध नहीं हैं, लेकिन इनमें से प्रत्येक के लिए एक पंक्ति है
मार्टिन स्मिथ

20
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)
);

मुझे लगता है कि यह एक अधिक पूर्ण उत्तर है क्योंकि यह स्कीमा की भी जांच करता है।
हामिद हेयर्डियन

6

उदाहरण मेरे लिए काम करते हैं, कृपया ध्यान दें "is_user_defined" NOT "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

4

आप सिस्टम टेबल_टिप्स दृश्य का भी उपयोग कर सकते हैं

IF EXISTS (SELECT *
           FROM   [sys].[table_types]
           WHERE  user_type_id = Type_id(N'[dbo].[UdTableType]'))
  BEGIN
      PRINT 'EXISTS'
  END 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.