কোনও টেবিলটিতে একটি কলাম যুক্ত করুন, যদি এটি ইতিমধ্যে বিদ্যমান না থাকে


188

আমি এমএস এসকিউএল সার্ভারের জন্য একটি কোয়েরি লিখতে চাই যা একটি টেবিলের মধ্যে একটি কলাম যুক্ত করে। তবে আমি কোনও ত্রুটি প্রদর্শন চাই না, যখন আমি নিম্নলিখিত কোয়েরিটি চালিত / চালিত করি।

আমি একটি সারণী যুক্ত করতে এই ধরণের ক্যোয়ারী ব্যবহার করছি ...

IF EXISTS (
       SELECT *
       FROM   sys.objects
       WHERE  OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
              AND TYPE IN (N'U')
   )

কিন্তু আমি জানি না কীভাবে কোনও কলামের জন্য এই কোয়েরিটি লিখবেন।



আপনি ব্যবহার করা উচিত sys.tables"Generic" পরিবর্তে sys.objects- তারপর আপনি স্পষ্টভাবে টাইপ নির্দিষ্ট করতে হবে না (তা থেকে সুস্পষ্ট sys.tablesইতিমধ্যে ....)
marc_s

COL_LENGTH বিকল্প কেবলমাত্র এসকিউএল-সার্ভার ২০০৮ থেকে কাজ করে, তবে এটি কাজ করে।
পল-হেনরি

উত্তর:


218

sys.columnsআইও টেবিলটি ব্যবহার করে আপনি অনুরূপ নির্মাণ ব্যবহার করতে পারেন sys.objects

IF NOT EXISTS (
  SELECT * 
  FROM   sys.columns 
  WHERE  object_id = OBJECT_ID(N'[dbo].[Person]') 
         AND name = 'ColumnName'
)

42
মনে রাখবেন যে এই পরিস্থিতিতে আপনি যদি আপনার আসল কোডে উপস্থিত না থাকেন তবে ব্যবহার করতে চান।
নাট

2
অনুকূলিত ক্যোয়ারির জন্য আপনি নির্বাচিত বিবৃতি সহ শীর্ষ 1 ব্যবহার করতে পারেন
বঙ্কেশ্বর নারায়ণ

11
পছন্দ করুন একটি ধারাতে সাবকিউয়ের জন্য কার্যকর করার পরিকল্পনাগুলি EXISTSঅভিন্ন। মত SELECT 1বা SELECT TOP 1অপ্রয়োজনীয় জিনিস । EXISTSদফা নিজেই ক্যোয়ারী অপটিমাইজার বলে শুধুমাত্র সম্পাদন করতে ন্যূনতম প্রয়োজনীয় সার্চ নির্ণয় করা EXISTS... অন্তত SQL সার্ভার হবে। অন্যান্য ডিবি ইঞ্জিনগুলিতে কম বা কম দক্ষ ক্যোয়ারী অপ্টিমাইজার থাকতে পারে।
কেনেথ কোচরান

9
@ ব্যাঙ্কটেশ্বরনারায়ণ যদি আপনি আপনার ADD Columnপ্রশ্নগুলি অপ্টিমাইজ করে থাকেন ... আপনার অবশ্যই এটি প্রায়শই চালানো উচিত!
ফেন্টন

1
@ ইউজার 391313 - আমি ওপি পোস্টের মতো একটি অনুরূপ নির্মাণ পোস্ট করেছি তবে হ্যাঁ, আপনি যদি কলামটি উপস্থিত না থেকে ব্যবস্থা নিতে চান তবে বিবৃতিটি যদি উপস্থিত না থাকে IST আমি এর জন্য উত্তরটি সম্পাদনা করার প্রয়োজনটি সত্যিই অনুভব করি না তবে আপনি যদি এটির উন্নতি বলে মনে করেন তবে নিজেকে নির্দ্বিধায় দ্বিধা বোধ করবেন না।
লিভেন কের্মসেকারগণ

91
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
    ALTER TABLE table_name
    ADD [column_name] INT
END

1
আমি এটি করার চেষ্টা করেছিলাম তবে এটি একটি ত্রুটি ফেরায় যা বলে যে COL_LENGTH ফাংশনটি বিদ্যমান নেই।
THEpRoGrAmMiNgNoOb

3
এসকিউএল সার্ভারের প্রয়োজন ২০০++
রবার্ট ব্রাউন

6
ছোট সংযোজন - কলামের নামে স্কোয়ার বন্ধনী ব্যবহার করা উচিত নয়, যেহেতু COL_LENGTH('table_name', '[column_name]')সর্বদা এসকিউএল সার্ভার 2016 ( COL_LENGTH('[table_name]', 'column_name') works as expected) এ বাতিল হয়।
স্টপ-ক্র্যান

33

আরেকটি বিকল্প। আমি এই পদ্ধতির পছন্দ করি কারণ এটি কম লেখালেখি হলেও দু'জন একই কাজ করে।

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL
END

আমি লক্ষ্য করেছি যে আপনার কোথায় সারণী বিদ্যমান আছে তা সন্ধান করছে যা সম্ভবত এটিই

 if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null

2
আমি এটা পছন্দ করি. আমি মনে করি যে এখানে পোস্ট করার সর্বোত্তম অংশটি এই জাতীয় রত্নগুলি সন্ধান করছে।
জেস্টেডি

2
'কলামিড' কী?
মারিউস স্টেনেসু

'কলামিড' হ'ল কলামের সম্পত্তিটির বিরুদ্ধে যা আপনি পরীক্ষা করছেন the আপনি সম্ভবত কোনো সম্পত্তি নাম যেমন নাম, ইত্যাদি একটি কলাম বিদ্যমান ব্যবহৃত হতে পারে
জ্যাক বশ

5

এখানে আমার জন্য আরও একটি ভিন্নতা কাজ করেছে।

IF NOT EXISTS (SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE upper(TABLE_NAME) = 'TABLENAME'
        AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
    ALTER TABLE [dbo].[Person] ADD Column
END
GO

সম্পাদনা: নোট করুন যে INFORMATION_SCHEMAদর্শনগুলি সর্বদা আপডেট নাও হতে পারে, SYS.COLUMNSপরিবর্তে ব্যবহার করুন:

IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....


0
IF NOT EXISTS (SELECT * FROM syscolumns
  WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
  ALTER TABLE [db].[Employee]
  ADD [EmpName] VARCHAR(10)
GO

আমি আশা করি এটি সাহায্য করবে। অধিক তথ্য


এটি আমার জন্য স্কেল সার্ভার 2000-এ কাজ করেছিল যখন গৃহীত উত্তরটি দেয় নি। Sys। * ভিউগুলি স্কেল সার্ভার 2005 এর কাছাকাছি কোথাও যুক্ত হয়েছে বলে মনে হয় সিএফ। ডকস.মাইক্রোসফট.ইন- ইউএস
রিলেশনাল-

0

অন্য ডাটাবেসে কোনও কলাম অনুসন্ধান করার সময়, আপনি কেবল ডাটাবেসের নাম অন্তর্ভুক্ত করতে পারেন:

IF NOT EXISTS (
  SELECT * 
  FROM   DatabaseName.sys.columns 
  WHERE  object_id = OBJECT_ID(N'[DatabaseName].[dbo].[TableName]') 
         AND name = 'ColumnName'
)

-1
IF NOT EXISTS (SELECT 1  FROM SYS.COLUMNS WHERE  
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.