এসকিউএল সার্ভার ২০০৮-এ ব্যবহারকারী-সংজ্ঞায়িত টেবিল প্রকারের অস্তিত্ব কীভাবে পরীক্ষা করবেন?


164

আমার কাছে একটি ব্যবহারকারী-সংজ্ঞায়িত টেবিল প্রকার রয়েছে। OBJECT_ID(name, type)ফাংশন ব্যবহার করে কোনও প্যাচে সম্পাদনা করার আগে আমি এর অস্তিত্ব পরীক্ষা করতে চাই ।

ব্যবহারকারী-সংজ্ঞায়িত টেবিল প্রকারের জন্য গণনাtype থেকে কী পাস করা উচিত?

N'U' যেমন ব্যবহারকারী সংজ্ঞায়িত টেবিল কাজ করে না, যেমন IF OBJECT_ID(N'MyType', N'U') IS NOT NULL

উত্তর:


188

আপনি সিএস টাইপগুলি দেখতে বা TYPE_ID ব্যবহার করতে পারেন:

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

কেবলমাত্র একটি সতর্কতা: টাইপ_আইডি ব্যবহার করে যাচাই করা হবে না যে প্রকারটি একটি টেবিলের ধরণ - কেবলমাত্র সেই নামে কোনও প্রকারের উপস্থিতি রয়েছে। অন্যথায় জিবিএন এর ক্যোয়ারী সম্ভবত আরও ভাল।


আমি নির্লজ্জভাবে IF OBJECT_ID(N'MyType', 'TT') IS NULLকোনও সাফল্য না দিয়ে করার চেষ্টা করছিলাম , তবে আপনার সমাধান কার্যকর হয়েছে।
অ্যালন গুরালেক

1
'টিটি' গণনাটি কেবল এসকিএল সার্ভারে কাজ করে 2012 বা তার পরে (যেমন আমি সবেমাত্র জানতে
আয়ান

3
@ আইইন এখনও বাস্তবে তা করে না। নাম অনুসারে কোনও সারণী প্রকারের জন্য আপনি OBJECT_ID ব্যবহার করতে পারবেন না - চেক আউট করুনSELECT name FROM sys.objects WHERE type = 'TT'
এনআরাইলিংহ

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

sys.tyype ... এগুলি স্কিমা- স্কোপযুক্ত বস্তু নয় তাই sys.objects এ থাকবে না

আপডেট, মার্চ 2013

আপনি ব্যবহার করতে পারেন TYPE_ID খুব


5
আমি বিশ্বাস করি যে আপনার দ্বিতীয় মন্তব্যটি সঠিক নয়। যদি আমি ভুল না হয়ে থাকি তবে ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি প্রকৃতপক্ষে স্কিমা-স্কোপড ( Schema_IDআসলে যে সিসি.প্রকারের টেবিলের সাথে আপনি লিঙ্ক করেছেন সেগুলির মধ্যে একটি বৈশিষ্ট্য এটিই ; এ কারণেই এগুলি [ডিবিও] হিসাবে উল্লেখ করা যেতে পারে [[মাইইউডিটাইপ] )। তবুও, আপনি ঠিক বলেছেন যে ইউডি প্রকারগুলি সিস.ওবজেক্টগুলিতে তালিকাভুক্ত নয় এবং সুতরাং OBJECT_ID () দ্বারা অ্যাক্সেসযোগ্য নয়। (যে কোনও কারণেই হোক, সিস.ওবজেক্টস স্কিমা-
স্কোপড

1
@ কেমোট - এগুলিকে 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)
);

আমি মনে করি এটি আরও সম্পূর্ণ উত্তর কারণ এটি স্কিমাটিও পরীক্ষা করে che
হামিদ হাইডার্ডিয়ান

6

নিম্নলিখিত উদাহরণগুলি আমার জন্য কাজ করে, দয়া করে নোট করুন "is_user_de সংজ্ঞায়িত" নয় "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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.