কীভাবে ডেটা না হারিয়ে এসকিউএল ডাটাবেসে কলাম ডেটাটাইপ পরিবর্তন করবেন change


198

আমি SQL সার্ভার ডাটাবেস আছে এবং আমি শুধু বুঝতে পারেন যে আমি থেকে কলামের এক ধরণ পরিবর্তন করতে পারেন intথেকে bool

ইতিমধ্যে সেই টেবিলটিতে প্রবেশ করা ডেটা না হারিয়ে আমি কীভাবে এটি করতে পারি?


3
আপনি কি একটি নতুন বিট কলাম তৈরি করার চেষ্টা করেছেন, পুরানো কলামটি নতুনকে কপি করে পুরনোটি মুছে ফেলে নতুন নামকরণ করেছেন? এই সমস্ত একটি লেনদেন, অবশ্যই, সমস্যা উপর রোলব্যাক।
রাদু ক্যাপ্রেস্কু

2
আপনি বলছেন "আমি ঠিক বুঝতে পেরেছি যে আমি কলামগুলির মধ্যে একটি থেকে ইনট থেকে বুলে পরিবর্তন করতে পারি" কোনও বুলিয়ান ডেটাটাইপ নেই। যদিও কিছুটা আছে। আপনি কীভাবে জিজ্ঞাসা করছেন কীভাবে আপনি এটি করতে পারেন (এখনও পর্যন্ত 2 টি উত্তর আবৃত হয়েছে)। বা আপনার প্রশ্নটি "আমি বুঝতে পেরেছি এটি সম্ভব! - এসকিউএল সার্ভার এটি কীভাবে করে ?"
মার্টিন স্মিথ

উত্তর:


329

আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে এটি সহজেই করতে পারেন। 0 এর যে কোনও মান 0 তে (বিআইটি = মিথ্যা) রূপান্তরিত হবে, অন্য যে কোনও কিছুই 1 (বিআইটি = সত্য) তে রূপান্তরিত হবে।

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

অন্য বিকল্পটি হ'ল একটি নতুন কলাম তৈরি করুন BIT, এটি পুরানো কলামটি থেকে পূরণ করুন, এবং আপনার কাজ শেষ হয়ে গেলে, পুরানো কলামটি ফেলে দিন এবং নতুনটির নাম পুরানো নামে রাখবেন। এইভাবে, যদি রূপান্তরকালে কোনও কিছু ভুল হয়ে যায় তবে আপনি সবসময়ই ফিরে যেতে পারেন যেহেতু আপনার কাছে এখনও সমস্ত ডেটা রয়েছে ..


10
অন্য কথায়: NULLঅবশেষ NULL, 0হয়ে যায় False, অ-শূন্য মান (1, -1, 1999, -987 ...) হয়ে যায় True
vlvaro González

2
এবং জিইউআই থেকে কখনও এ জাতীয় পরিবর্তন করবেন না। সর্বদা এটির মতো স্ক্রিপ্টের মাধ্যমে তৈরি করুন। জিইউআই টেবিলটি ড্রপ এবং পুনরায় তৈরি করবে এবং এটি অনেক বেশি সময় সাশ্রয়ী। যদি টেবিলটি বড় হয় এবং উত্পাদনে থাকে তবে এটি বিপর্যয়কর হতে পারে। প্লাস সমস্ত টেবিল পরিবর্তনের একটি স্ক্রিপ্ট থাকা উচিত যা অন্যান্য সমস্ত কোডের মতো উত্স নিয়ন্ত্রণে থাকে।
এইচএলজিইএম

1
আমি যুক্ত করব, ডেটা সহ কোনও টেবিলে কোনও কাঠামোগত পরিবর্তন করার আগে আপনার কাছে নিশ্চিত হয়ে গেছে যে আপনার ডাটাবেসের একটি বর্তমান ব্যাকআপ রয়েছে। এবং টেবিলটি ঘন ঘন ব্যবহার করা বা বড় হয় তবে পিক ব্যবহারের সময়গুলি উত্পাদন হিসাবে এই জাতীয় পরিবর্তন চালাবেন না।
এইচএলজিইএম

আমি ভুলভাবে সম্পাদনাগুলি অনুমোদন করেছি ... প্রত্যাখ্যান করা দরকার .. কারণ সেখানে কোনও উন্নতি হয়নি ... উত্তর নির্ভুল।
বিকাশ পাঠক


20

যদি এটি একটি বৈধ পরিবর্তন।

আপনি সম্পত্তি পরিবর্তন করতে পারেন।

সরঞ্জাম -> বিকল্পগুলি -> ডিজাইনার -> টেবিল এবং ডেটাবেস ডিজাইনার -> আনচেক করুন -> সারণী পুনরায় তৈরির জন্য প্রয়োজনীয় পরিবর্তনগুলি সংরক্ষণ করা প্রতিরোধ করুন।

এখন আপনি টেবিলটি পুনরায় তৈরি করা বা আপনার রেকর্ডগুলি না হারিয়ে সহজেই কলামের নামটি পরিবর্তন করতে পারেন।


5
কোনও পরিস্থিতিতে জিইআইআই ব্যবহার করে আপনার টেবিল পরিবর্তন করা উচিত নয়। এটি পরিবর্তিত টেবিলটি ব্যবহার না করে সম্পূর্ণভাবে টেবিলটি পুনরায় তৈরি করবে এবং আপনি যদি এটিটি চেক করেন এবং টেবিলটি বড় হয় তবে এটি সমস্যার কারণ হয়ে দাঁড়াবে। এছাড়াও সোর্স কন্ট্রোলের স্ক্রিপ্টে টেবিলের সমস্ত পরিবর্তন আপনার থাকা উচিত।
এইচএলজিইএম

এই বিকল্পটি আরও ঘনিষ্ঠভাবে দেখুন - এটি এমন একটি সুরক্ষা বন্ধ করে দিচ্ছে যা জিইউআই কে টেবিলটি নামানো থেকে রোধ করবে। আপনি না প্রদর্শিত , হারান ডেটাতে কারণ গুই টেবিল পুনঃ হবে, কিন্তু সার্ভারে কপি / ড্রপ হবে। সুতরাং, যদি টেবিলটিতে প্রচুর ডেটা থাকে তবে এটি একটি খুব বড় ক্রিয়াকলাপ ঘটায়। এছাড়াও, আমি মনে করি (ইতিবাচক নয়) এটি একটি একক লেনদেনে ঘটে তাই আপনি আপনার লেনদেনের লগটি পূরণ করতে পারেন।
জেমার্চ

1
আমার ধারণা আমি আমার আগের মন্তব্যে কিছুটা স্পষ্টতা যোগ করতে চাই। আপনি যদি কেবল আপনার বিকাশ মেশিনে এটি করে থাকেন তবে আপনি সম্ভবত ভাল আছেন। তবে আমি একটি উত্পাদন ডেটাবেজে এই পদ্ধতিটি ব্যবহার করার পরামর্শ দেব না - বিশেষত যদি এটি একটি মিশন সমালোচনামূলক।
জেমার্চ

8

আপনি কেন ডেটা হারাবেন বলে মনে করেন? কেবল ম্যানেজমেন্ট স্টুডিওতে যান এবং ডেটা টাইপ পরিবর্তন করুন। যদি বিদ্যমান মানটিকে বিলে (বিট) রূপান্তর করা যায় তবে এটি তা করবে। অন্য কথায়, যদি "1" মানচিত্রটি সত্য হয় এবং "0" মানচিত্রগুলি যদি আপনার মূল ক্ষেত্রে মিথ্যা হয় তবে আপনি ভাল হয়ে যাবেন।


1
টেবিলে আপনার ডেটা থাকলে এটি কাজ করবে না। আপনি যখন কোনও কলামের ধরণের পরিবর্তন করার চেষ্টা করছেন, এসএমএস দাবি করে যে এটির জন্য প্রথমে টেবিলটি ফেলে দেওয়া দরকার ... ALTER TABLE এর পরে কোনটি অবশ্যই ভুল ... ALTER COLUMN কমান্ড এমনকি নাল নয় এমন ক্ষেত্রের জন্যও ঠিক কাজ করে। এ কারণেই তারা ভেবেছিল যে তারা ডেটা শিথিল করতে পারে।
টনি ও'হাগান

1
@ টনিও'হাগান এটি সত্য নয়। আপনি সতর্কতাটি বন্ধ করতে পারেন এবং এটি বিদ্যমান ডেটা দিয়ে ঠিক কাজ করবে। আরও দেখুন stackoverflow.com/questions/2947865/...
ফিলিপ Leybaert

1
ঠিক আছে শান্ত হও! তা জানতাম না। কেবল আপনাকে (পিছনে) ভোট দেওয়ার চেষ্টা করেছিলেন তবে আপনি নিজের উত্তরটি সম্পাদনা না করলে এসও আমাকে বাধা দিচ্ছে। সম্ভবত একটি সামান্য পরিবর্তন এবং আমি এটি করতে পারি;)।
টনি ও'হাগান

1
কোনও পরিস্থিতিতে জিইআইআই ব্যবহার করে আপনার টেবিল পরিবর্তন করা উচিত নয়। এটি পরিবর্তিত টেবিলটি ব্যবহার না করে সম্পূর্ণভাবে টেবিলটি পুনরায় তৈরি করবে এবং আপনি যদি এটিটি চেক করেন এবং টেবিলটি বড় হয় তবে এটি সমস্যার কারণ হয়ে দাঁড়াবে। সোর্স কন্ট্রোলের স্ক্রিপ্টে টেবিলের সমস্ত পরিবর্তন আপনার থাকা উচিত।
এইচএলজিইএম

কোনও পরিস্থিতিতে নেই table জিইউআই ব্যবহার করার জন্য টেবিল ডিজাইন করতে বা সেগুলি পরিবর্তন করার কোনও কারণ নেই এবং এটি করার উপযুক্ত কারণ নেই। সমস্ত সার্ভারগুলিতে অন্যান্য সার্ভারগুলিতে প্রচার করতে সক্ষম হওয়ার জন্য এবং সেগুলি সোর্স নিয়ন্ত্রণে থাকা কোডের মতো আচরণ করা সমস্ত স্ক্রিপ্টে থাকা দরকার।
এইচএলজিইএম

5

আপনি যদি টি-এসকিউএল (এমএসএসকিউএল) ব্যবহার করেন; আপনার এই লিপিটি চেষ্টা করা উচিত:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

আপনি যদি মাইএসকিউএল ব্যবহার করেন; আপনার এই লিপিটি চেষ্টা করা উচিত:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

যদি আপনি ওরাকল ব্যবহার করেন; আপনার এই লিপিটি চেষ্টা করা উচিত:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

সরঞ্জাম-বিকল্প-ডিজাইনার-সারণী এবং ডেটাবেস ডিজাইনার এবং আনচেক প্রতিরোধের বিকল্পের বিকল্পে যানএখানে চিত্র বর্ণনা লিখুন


1
কোনও পরিস্থিতিতে জিইআইআই ব্যবহার করে আপনার টেবিল পরিবর্তন করা উচিত নয়। এটি পরিবর্তিত টেবিলটি ব্যবহার না করে সম্পূর্ণভাবে টেবিলটি পুনরায় তৈরি করবে এবং আপনি যদি এটিটি চেক করেন এবং টেবিলটি বড় হয় তবে এটি সমস্যার কারণ হয়ে দাঁড়াবে। সোর্স কন্ট্রোলের স্ক্রিপ্টে টেবিলের সমস্ত পরিবর্তন আপনার থাকা উচিত।
এইচএলজিইএম

2

চেক প্রকারের কলামের সাথে কলামের ডেটা টাইপ পরিবর্তন করুন:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

আমার জন্য, স্ক্যুয়াল সার্ভার ২০১ 2016 সালে, আমি এটি এটি করি

কলাম 1 কলাম 1 নাম কলাম 2 এ নামকরণ করতে

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* কলামটি স্ট্রিং থেকে ইনট অবধি সংশোধন করতে :( দয়া করে নিশ্চিত হন যে ডেটা সঠিক ফর্ম্যাটে রয়েছে )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

কমপ্যাক্ট সংস্করণে ডেটটাইম ডেটা টাইপের জন্য স্বয়ংক্রিয়ভাবে আকার হবে (8) সুতরাং ক্ষেত্রের আকার নির্ধারণ করার এবং এই ক্রিয়াকলাপের জন্য ত্রুটি উত্পন্ন করার দরকার নেই ...


-2

আমি নিম্নলিখিত প্রশ্নের সাথে টেবিল ক্ষেত্রের ডেটাটাইপটি সংশোধন করতে পারি: এবং ওরাকল ডিবিতেও,

ALTER TABLE table_name
MODIFY column_name datatype;

এসকিউএল সার্ভারে নেই
এইচএলজিইএম

-4

ডেটাটাইপটি ডেটা না হারিয়ে প্রতিস্থাপন করুন

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