বিদ্যমান কলামে একটি পরিচয় যুক্ত করা হচ্ছে


445

আমাকে একটি পরিচয় কলামে একটি টেবিলের প্রাথমিক কীটি পরিবর্তন করতে হবে এবং টেবিলটিতে ইতিমধ্যে বেশ কয়েকটি সারি রয়েছে।

আমি আইডিগুলি পরিষ্কার করতে একটি স্ক্রিপ্ট পেয়েছি যাতে এটি শুরু হয় 1 থেকে শুরু করে, আমার পরীক্ষার ডাটাবেসে সূক্ষ্মভাবে কাজ করে।

পরিচয়ের সম্পত্তি পেতে কলামটি পরিবর্তন করার জন্য এসকিউএল আদেশ কী?

উত্তর:


482

আপনি পরিচয়ের জন্য বিদ্যমান কলামগুলি পরিবর্তন করতে পারবেন না।

আপনার কাছে 2 টি বিকল্প রয়েছে,

  1. পরিচয় সহ একটি নতুন টেবিল তৈরি করুন এবং বিদ্যমান টেবিলটি বাদ দিন

  2. পরিচয় সহ একটি নতুন কলাম তৈরি করুন এবং বিদ্যমান কলামটি বাদ দিন

পদ্ধতির ১. ( নতুন টেবিল ) এখানে আপনি সদ্য নির্মিত পরিচয় কলামে বিদ্যমান ডেটা মানগুলি ধরে রাখতে পারবেন।

CREATE TABLE dbo.Tmp_Names
    (
      Id int NOT NULL
             IDENTITY(1, 1),
      Name varchar(50) NULL
    )
ON  [PRIMARY]
go

SET IDENTITY_INSERT dbo.Tmp_Names ON
go

IF EXISTS ( SELECT  *
            FROM    dbo.Names ) 
    INSERT  INTO dbo.Tmp_Names ( Id, Name )
            SELECT  Id,
                    Name
            FROM    dbo.Names TABLOCKX
go

SET IDENTITY_INSERT dbo.Tmp_Names OFF
go

DROP TABLE dbo.Names
go

Exec sp_rename 'Tmp_Names', 'Names'

পদ্ধতির 2 ( নতুন কলাম ) আপনি নতুন তৈরি হওয়া পরিচয় কলামে বিদ্যমান ডেটা মানগুলি ধরে রাখতে পারবেন না, পরিচয় কলামটি সংখ্যার ক্রম ধরে রাখবে।

Alter Table Names
Add Id_new Int Identity(1, 1)
Go

Alter Table Names Drop Column ID
Go

Exec sp_rename 'Names.Id_new', 'ID', 'Column'

আরও তথ্যের জন্য নিম্নলিখিত মাইক্রোসফ্ট এসকিউএল সার্ভার ফোরাম পোস্টটি দেখুন:

সনাক্তকরণে কলাম কীভাবে পরিবর্তন করবেন (1,1)


49
যদি টেবিলের ডেটা ছোট হয় তবে এই বিকল্পটি মারাত্মকভাবে কাজ করে। যদি টেবিলটি বড় হয় তবে আমি পছন্দ করি এমন আরও একটি বিকল্প রয়েছে: ALTER TABLE ব্যবহার করুন ... সারণী স্কিমাটি অন্য একটি সংস্করণ দিয়ে আইডেন্টিটি কলামের সাথে প্রতিস্থাপন করতে স্যুইচ করুন তবে অন্যথায় অভিন্ন স্কিমা। অল্টার টেবিলের সুবিধা .... সুইচ পদ্ধতির সুবিধাটি হ'ল এটি দ্রুত সম্পন্ন হয় (বিলিয়ন-সারি টেবিলের জন্য 5 সেকেন্ডের নীচে) যেহেতু কোনও টেবিলের ডেটা অনুলিপি করা বা পরিবর্তন করা দরকার না। যদিও সতর্কতা এবং সীমাবদ্ধতা রয়েছে। বিস্তারিত জানার জন্য নীচে আমার উত্তর দেখুন।
জাস্টিন গ্রান্ট

7
@ জাস্টিন গ্রেট: একটি খুব আকর্ষণীয় বিকল্প এবং একটি যা আমি বিবেচনা করি নি! এটি কাজ করার কারণটি হ'ল পরিচয়টি একটি কলামের সম্পত্তি এবং কোনও ডেটা টাইপ নয়, সুতরাং সুইচ পদ্ধতিটি দুটি সারণীর (পুরানো এবং নতুন) মধ্যে সনাক্তকারী হিসাবে পরিচয় পার্থক্য নির্বিশেষে স্কিমাকে বৈধ করে। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
জন সানসোম

আপনার যদি খুব বেশি ডেটা না থাকে তবে এসএসএমএস থেকে স্ক্রিপ্ট তৈরি করে "টেবিল তৈরি করা" অর্জন করা যেতে পারে। টেবিলটি> স্ক্রিপ্ট সারণী হিসাবে> টেবিল তৈরি করুন> (নতুন ক্যোয়ারী সম্পাদক?) এ ডান ক্লিক করুন। তারপরে এটি ফেলে দিন এবং সেই স্ক্রিপ্টের ভিতরে আপনি IDENTITY(1, 1)প্রাথমিক কী কলামটির সাথে অংশটি যুক্ত করতে পারেন
goamn

এটি প্রয়োগের জন্য কেউ এসএমএস ব্যবহার করতে পারে। সরঞ্জামগুলিতে যান> বিকল্পগুলি> ডিজাইনার> আন-চেক করুন "সংরক্ষণের পরিবর্তনগুলি সংরক্ষণ করুন যা টেবিল পুনরায় তৈরির প্রয়োজন require" বিটিডব্লিউ মোটামুটি বড় টেবিলগুলির জন্য এটির প্রস্তাব দেওয়া হয় না।
জাফর 14

পোস্টগ্রেএসকিউএল-তে আপনি কমান্ডের সাহায্যে একটি বিদ্যমান পূর্ণসংখ্যা কলামে পরিচয় যুক্ত করতে পারেন : পরিবর্তনের টেবিল {টেবিলের নাম} পরিবর্তক কলাম {কলাম_নাম always সর্বদা পরিচয় হিসাবে উত্পন্ন করা ({সংখ্যা with দিয়ে পুনরায় চালু করুন);
অ্যান্ড্রু ম্যাকি

209

এসকিউএল 2005 এবং তারপরে, টেবিলের ডেটা পৃষ্ঠাগুলি পরিবর্তন না করেই এই সমস্যাটি সমাধান করার কৌশল আছে। এটি বড় টেবিলগুলির জন্য গুরুত্বপূর্ণ যেখানে প্রতিটি ডেটা পৃষ্ঠাকে স্পর্শ করতে কয়েক মিনিট বা ঘন্টা সময় নিতে পারে। কৌতুকটি এমনকি পরিচয় কলামটি একটি প্রাথমিক কী হলেও কোনও ক্লাস্টারযুক্ত বা নন-ক্লাস্টারযুক্ত সূচকের অংশ বা অন্য গোটাচ যা সহজ "যোগ / অপসারণ / পুনর্নবীকরণ কলাম" সমাধানটি ট্রিপ করতে পারে এমনকি তার জন্যও কাজ করে।

কৌশলটি এখানে: আপনি এসকিউএল সার্ভারের অল্টার টেবিল ব্যবহার করতে পারেন ... ডেটা পরিবর্তন না করে কোনও টেবিলের স্কিমা পরিবর্তন করতে সুইচ স্টেটমেন্টটি ব্যবহার করতে পারেন , যার অর্থ আপনি কোনও সারণী স্কিমার সাথে কোনও পরিচয় দিয়ে কোনও টেবিলটি প্রতিস্থাপন করতে পারেন, তবে কোনও পরিচয় কলাম ছাড়াই। একই কৌশলটি একটি বিদ্যমান কলামে আইডেন্টিটি যুক্ত করতে কাজ করে।

সাধারণত, ALTER TABLE ... সুইচটি একটি নতুন, খালি পার্টিশন সহ পার্টিশনযুক্ত টেবিলের একটি সম্পূর্ণ পার্টিশন দক্ষতার সাথে প্রতিস্থাপন করতে ব্যবহৃত হয়। তবে এটি বিভাজনবিহীন টেবিলগুলিতেও ব্যবহার করা যেতে পারে।

আমি এই কৌশলটি 5 সেকেন্ডের মধ্যে আইডেন্টিটি থেকে একটি অ-পরিচয় হিসাবে 2.5 বিলিয়ন সারি টেবিলের একটি কলামকে রূপান্তর করতে ব্যবহার করেছি (বহু ঘন্টা ক্যোয়ারী চালানোর জন্য যার জিজ্ঞাসা পরিকল্পনাটি পরিচয় সনাক্ত না করার জন্য আরও ভাল কাজ করেছে কলামগুলি) এবং তারপরে আবার 5 সেকেন্ডেরও কম সময়ে পরিচয় সেটিংটি পুনরুদ্ধার করে।

এটি কীভাবে কাজ করে তার একটি কোড নমুনা এখানে।

 CREATE TABLE Test
 (
   id int identity(1,1),
   somecolumn varchar(10)
 );

 INSERT INTO Test VALUES ('Hello');
 INSERT INTO Test VALUES ('World');

 -- copy the table. use same schema, but no identity
 CREATE TABLE Test2
 (
   id int NOT NULL,
   somecolumn varchar(10)
 );

 ALTER TABLE Test SWITCH TO Test2;

 -- drop the original (now empty) table
 DROP TABLE Test;

 -- rename new table to old table's name
 EXEC sp_rename 'Test2','Test';

 -- update the identity seed
 DBCC CHECKIDENT('Test');

 -- see same records
 SELECT * FROM Test; 

এটি অন্যান্য জবাবগুলির সমাধানগুলির চেয়ে স্পষ্টতই জড়িত, তবে যদি আপনার টেবিলটি বড় হয় তবে এটি সত্যিকারের জীবন রক্ষাকারী হতে পারে। কিছু সতর্কতা রয়েছে:

  • আমি যতদূর জানি, পরিচয় হ'ল এই পদ্ধতিটি দিয়ে আপনি কেবল নিজের টেবিলের কলামগুলি পরিবর্তন করতে পারবেন। কলামগুলি যুক্ত / সরিয়ে ফেলা, অযোগ্যতা পরিবর্তন করা ইত্যাদি অনুমোদিত নয়।
  • আপনি স্যুইচটি করার আগে ফোরইগেন কীগুলি ফেলে দিতে হবে এবং সেগুলি পুনরুদ্ধার করতে হবে।
  • স্কাইমবাইন্ডিং ফাংশন, দর্শন ইত্যাদির জন্য একই ame
  • নতুন টেবিলের সূচিগুলিকে ঠিক মিল করতে হবে (একই কলাম, একই ক্রম, ইত্যাদি)
  • পুরানো এবং নতুন সারণী একই ফাইলগ্রুপে থাকা দরকার।
  • কেবল এসকিউএল সার্ভার 2005 বা তার পরে কাজ করে
  • আমি পূর্বে বিশ্বাস করেছিলাম যে এই কৌশলটি কেবল এসকিউএল সার্ভারের এন্টারপ্রাইজ বা বিকাশকারী সংস্করণগুলিতে কাজ করে (কারণ পার্টিশনগুলি কেবলমাত্র এন্টারপ্রাইজ এবং বিকাশকারী সংস্করণগুলিতে সমর্থিত), তবে মেসন জি জুইভিটি নীচে তার মন্তব্যে বলেছেন যে এটি এসকিউএল স্ট্যান্ডার্ড সংস্করণেও কাজ করে। আমি ধরে নিলাম এর অর্থ এই যে এন্টারপ্রাইজ বা বিকাশকারীদের জন্য সীমাবদ্ধতা ALTER TABLE ... সুইচটিতে প্রযোজ্য না।

টেকনেট উপরোক্ত প্রয়োজনীয়তাগুলি বিশদে একটি ভাল নিবন্ধ রয়েছে

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

এখানে আরও একটি সতর্কতা রয়েছে যা উল্লেখ করার মতো। যদিও নতুন টেবিলটি আনন্দের সাথে পুরানো টেবিলটি থেকে ডেটা পাবেন এবং সমস্ত নতুন সারি একটি পরিচয়ের ধরণ অনুসরণ করে সন্নিবেশ করা হবে, তবে এটি 1 এ শুরু হবে এবং উল্লিখিত কলামটি প্রাথমিক কী হলে সম্ভাব্যভাবে ভেঙে যাবে। DBCC CHECKIDENT('<newTableName>')স্যুইচ করার পরে অবিলম্বে চলমান বিবেচনা করুন । আরও তথ্যের জন্য দেখুন msdn.microsoft.com/en-us/library/ms176057.aspx

যদি সারণিটি সক্রিয়ভাবে নতুন সারিগুলির সাথে প্রসারিত হচ্ছে (যার অর্থ পরিচয় যোগ করা এবং নতুন সারি যুক্ত করার মধ্যে যদি কোনও ডাউনটাইম থাকে না তবে তার পরিবর্তে DBCC CHECKIDENTআপনি নতুন টেবিল স্কিমায় পরিচয় বীজ মানটি ম্যানুয়ালি সেট করতে চান টেবিল, যেমন সর্ববৃহৎ বিদ্যমান আইডি চেয়ে বড় IDENTITY (2435457, 1)। আপনি উভয় অন্তর্ভুক্ত করতে সক্ষম হতে পারেন ALTER TABLE...SWITCHএবং DBCC CHECKIDENT(অথবা not-- এই পরীক্ষা আছে নেই) একটি লেনদেনে কিন্তু বীজ মান নিজে সেটিং সহজ এবং নিরাপদ হতে হবে মত মনে হয়।

স্পষ্টতই, যদি কোনও নতুন সারিটি টেবিলে যুক্ত না করা হয় (বা এগুলি কেবলমাত্র প্রতিদিনের ইটিএল প্রক্রিয়ার মতো মাঝে মধ্যে যোগ করা হয়) তবে এই রেসের অবস্থাটি ঘটবে না তাই DBCC CHECKIDENTভাল।


5
আমার স্মৃতি যদি সঠিক হয় তবে আমি এই নিবন্ধটি থেকে ধারণা পেয়েছি: sqlservercentral.com/articles/T-SQL/61979
জাস্টিন গ্রান্ট

2
এফওয়াইআই, এটি এসকিউএল 2008 আর 2 এর স্ট্যান্ডার্ড সংস্করণেও কাজ করে বলে মনে হচ্ছে। সম্ভবত তারা এই বৈশিষ্ট্যটি ঠিক তেমনভাবে সক্ষম করেছে যেহেতু তারা এখন ব্যাকআপ সংক্ষেপণ চালু করার ক্ষমতা সক্ষম করেছে।
ম্যাসন জি। ঝুইটি

3
@ জব্বিস্তা - ওপির প্রশ্নে বলা হয়েছে যে টেবিলে তার ইতিমধ্যে একটি প্রাথমিক কী রয়েছে এবং ইতিমধ্যে সঠিক মানগুলি নিশ্চিত করতে পারতেন, তবে তিনি কেবল এটিকে পরিচয় কলাম হিসাবে পরিবর্তন করতে চেয়েছিলেন। উপরের আমার উত্তরটি সেই সংকীর্ণ ব্যবহারের ক্ষেত্রে ফোকাস করেছে: আসলে কোনও ডেটা পরিবর্তন না করে কীভাবে আইডেন্টিটি কোনও কলামে যুক্ত করা যায়। উপরে আমি যে নথির নথিটি নথিভুক্ত করছি তা হ'ল বড় টেবিলগুলির জন্য একটি বিশাল সময়-সঞ্চয়কারী। আপনার যদি ডেটা পরিবর্তন করতে হয় তবে আপনাকে অন্যান্য সমাধানগুলি ব্যবহার করতে হবে।
জাস্টিন গ্র্যান্ট

3
এখানে আরও একটি সতর্কতা রয়েছে যা উল্লেখ করার মতো। নতুন টেবিলটি আনন্দের সাথে পুরানো টেবিলটি থেকে ডেটা গ্রহণ করবে এবং সমস্ত নতুন সারি একটি পরিচয়ের প্যাটার্ন অনুসরণ করে সন্নিবেশ করানো হবে তা ভেবেছিল, এই কলামটি প্রাথমিক কী হয়ে থাকলে সেগুলি 1 এ শুরু হবে এবং সম্ভাব্যভাবে ভেঙে যাবে। DBCC CHECKIDENT('<newTableName>')স্যুইচ করার পরে অবিলম্বে চলমান বিবেচনা করুন । আরও তথ্যের জন্য দেখুন msdn.microsoft.com/en-us/library/ms176057.aspx
এরিক উ

3
এটি একটি দুর্দান্ত উত্তর! এছাড়াও নোট করুন যে কলামগুলির nlalability একই হতে হবে। সুতরাং যদি আপনার কোনও কলামের অযোগ্যতা পরিবর্তন করতে হয় তবে আপনাকে এটি পরবর্তী পর্যায়ে করতে হবে। একই পিকে বাধা জন্য। আমি বর্তমান সর্বাধিকের সাথে মেলে সারণী তৈরিতে পরিচয় মানটিও পরিবর্তন করি: পরিচয় (সর্বোচ্চ +1, 1)
ফিলিপ

71

আপনি কোনও আইডেন্টিটি কলাম হতে কোনও কলাম পরিবর্তন করতে পারবেন না। আপনাকে যা করতে হবে তা হল একটি নতুন কলাম তৈরি করা যা গেট-গো থেকে আইডেন্টিটি হিসাবে সংজ্ঞায়িত করা হবে, তারপরে পুরাতন কলামটি বাদ দিন এবং নতুনটির নাম পুরনো নামকরণ করুন।

ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1)

ALTER TABLE (yourTable) DROP COLUMN OldColumnName

EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN'

আঙ্গুরের ছিরড়া


হয় প্যারামিটার \ @objname অস্পষ্ট বা দাবি করা ob @objtype (COLUMN) ভুল।
জেনি ও'রিলি

1
@ জেনিও'রিলি: এটিকে একটি পৃথক প্রশ্নে রাখুন এবং আপনি যে সম্পূর্ণ কমান্ড ব্যবহার করছেন তা আমাদের দেখান !
মার্ক_স

2
এটিই sp_rename পদ্ধতিটি ব্যর্থ হয়েছিল। আমি ত্রুটির পাঠ্য অনুসন্ধান করে স্ট্যাকওভারফ্লোতে একটি সমাধান পেয়েছি। এটি বন্ধনীগুলির সাথে কিছু কঠোর বাক্য গঠন নিয়ম বলে মনে হচ্ছে, যদিও আমার টেবিলটির নামে কোনও বিশেষ অক্ষর নেই।
জেনি ও'রিলি

1
বা এটির মতো হতে পারে: 'ALTER TABLE (yourTable) DROP COLUMN Old ColumnName' এবং 'ALTER TABLE (yourTable) ADD Old ColumnName INT পরিচয় (1,1)', কেন নাম পরিবর্তন করুন: পি
আর কে শর্মা

মার্ক, আমি এই বিশাল কমান্ডটি একটি বিশাল টেবিলের (300 মিলিয়ন ডলার সারি) চেষ্টা করেছিলাম, কিন্তু আমি 10 মিনিটের পরে প্রক্রিয়াটি থামিয়ে দিয়েছি
নাওমি

14

এখানে বর্ণিত দুর্দান্ত সমাধান রয়েছে: এসকিউএল সার্ভার - কলামে পরিচয় সম্পত্তি যুক্ত করুন বা সরান

এসকিউএল ম্যানেজারটিতে আপনার টেবিলটি ম্যানুয়ালি সম্পাদনা করে, পরিচয়টি স্যুইচ করুন, পরিবর্তনগুলি সংরক্ষণ করবেন না, পরিবর্তনের জন্য তৈরি করা স্ক্রিপ্টটি দেখান, এটি অনুলিপি করুন এবং এটি পরে ব্যবহার করুন।

এটি বিশাল সময় সাশ্রয়কারী, কারণ এটিতে (স্ক্রিপ্ট) আপনি যে টেবিলটি পরিবর্তন করেন তা সম্পর্কিত সমস্ত বিদেশী কী, সূচক ইত্যাদি থাকে। এটিকে ম্যানুয়ালি লিখছি ... Godশ্বর বারণ করবেন না।


এটি আমার ব্যবহৃত সমাধানটি - এসএসএমএস টি পরিবর্তন করতে টি-এসকিউএল উত্পন্ন করে ... এটি একই স্কিমা ডিজাইনের একটি নতুন টেম্প টেবিল তৈরি করে, তারপরে সমস্ত সারি অনুলিপি করে, উত্সটি সরিয়ে, এবং নাম পরিবর্তন করে । পুরোপুরি চলতে একটু সময় নিতে পারে তবে এটি পুরোপুরি কার্যকর হয়েছিল।
এমডিবেলচিও

আমার মনে হয় না যে পিনাল ডেভ আসলে বলছে যে আপনার তৈরি করা স্ক্রিপ্টটি আপনার চালানো দরকার, কেবলমাত্র ইউআই এর মাধ্যমে পরিবর্তনটি আপনার জন্য কী ঘটায় তা দেখানোর জন্য ...
জ্যাক

এসএসএমএসে এই স্ক্রিপ্টিং ফ্যাসিটি (কোনও টেবিলের সংজ্ঞা পরিবর্তনের ক্ষেত্রে) পার্টিশনযুক্ত টেবিলটি নথিভুক্ত করার সময় আসলে একমাত্র সঠিক সুবিধা। সর্বাধিক উপযুক্ত অবস্থান 'টাস্ক' -> 'স্ক্রিপ্ট টেবিল' সর্বদা স্ক্রিপ্ট করতে ভুলে যায় পার্টিশন ফাংশন!
মার্টিজন ভ্যান ডের জাগট

1
কারও পক্ষে সহায়ক হতে পারে। পরিবর্তনগুলির পরে পরিবর্তন স্ক্রিপ্ট পেতে। এসএসএমএসে নকশা মোডে টেবিলটি ডান ক্লিক করুন এবং "পরিবর্তন স্ক্রিপ্ট উত্পন্ন করুন" বিকল্পটি নির্বাচন করুন এবং স্থানীয় ড্রাইভে স্ক্রিপ্টটি সংরক্ষণ করুন
Vijai

11

পরিচয়ের পরিবর্তে SEQUENCE ব্যবহার করতে বিবেচনা করুন

সিক্যুয়াল সার্ভার ২০১৪-তে (আমি কম সংস্করণ সম্পর্কে জানি না) আপনি ক্রম ব্যবহার করে এটি সহজভাবে করতে পারেন।

CREATE SEQUENCE  sequence_name START WITH here_higher_number_than_max_existed_value_in_column INCREMENT BY 1;

ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT NEXT VALUE FOR sequence_name FOR column_name

এখান থেকে: একটি কলামের জন্য ডিফল্ট মান হিসাবে ক্রম


6

সহজ ব্যাখ্যা

Sp_RENAME ব্যবহার করে বিদ্যমান কলামটির নাম পরিবর্তন করুন

EXEC sp_RENAME 'টেবিল_নাম। উপস্থিতি_কলামনাম', 'নতুন_কলামনাম', 'কলাম'

পুনঃনামকরণের উদাহরণ:

বিদ্যমান কলামের ইউজারআইডি-এর নাম পরিবর্তন করে রাখা হয়েছে OldUserID

EXEC sp_RENAME 'AdminUsers.UserID' , 'OldUserID', 'COLUMN'

তারপরে প্রাথমিক কী এবং পরিচয় মান হিসাবে সেট করতে অল্টার ক্যোয়ারী ব্যবহার করে একটি নতুন কলাম যুক্ত করুন

ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1)

প্রাথমিক কী সেট করার উদাহরণ

নতুন নির্মিত কলামের নাম ইউজারআইডি

ALTER TABLE Users ADD UserID INT NOT NULL PRIMARY KEY IDENTITY(1,1)

তারপরে নামকরণকৃত কলামটি ফেলে দিন

ALTER TABLE Table_Name DROP COLUMN Renamed_ColumnName

ড্রপ নামকরণ কলাম জন্য উদাহরণ

ALTER TABLE Users DROP COLUMN OldUserID

এখন আমরা টেবিলের বিদ্যমান কলামে একটি প্রাথমিককি এবং পরিচয় যুক্ত করেছি।


5

আমি একটি জাভা বিকাশকারী, যা ডিবিএ ছাড়াই একটি দলে উঠতে হয়েছিল এবং যেখানে ডেভেলপার হিসাবে, আমি ডিবিএ অধিকার পেতে পারি না। আমাকে দুটি ডাটাবেসের মধ্যে একটি সম্পূর্ণ স্কিমা সরিয়ে নেওয়ার দায়িত্ব দেওয়া হয়েছিল, সুতরাং ডিবিএ না করেই আমাকে এটি করতে হয়েছিল এবং স্ক্রিপ্টগুলি চালিয়ে এটি করতে হয়েছিল, এসকিউএল সার্ভার ২০০৮-এ জিইউআই ব্যবহার করতে সক্ষম হচ্ছিলাম না কারণ আমার প্রশাসনিক অধিকার ছিল না।

সমস্ত কিছু ইস্যু ছাড়াই সরানো হয়েছিল, তবে, নতুন স্কিমা.ট্যাবেলে একটি সঞ্চিত প্রক্রিয়া চালানোর সময় আমি দেখতে পেলাম আমি একটি টেবিলে পরিচয় ক্ষেত্রটি হারিয়েছি। আমি টেবিলটি তৈরি করে এমন স্ক্রিপ্টটিকে ডাবল চেক করেছি এবং এটি ছিল, তবে, স্ক্রিপ্টটি চালানোর সময় এসকিউএল সার্ভার এটি পেল না। পরে আমাকে একটি ডিবিএ জানিয়েছিল যে সে আগে এই একই সমস্যাটি দেখেছিল।

যে কোনও ইভেন্টে, এসকিউএল সার্ভার ২০০৮-এর জন্য, এই সমাধানের জন্য আমি যে পদক্ষেপ নিয়েছি এবং তারা কাজ করেছে, তাই এটি কারওর জন্য সহায়ক হবে এই আশায় আমি এখানে পোস্ট করছি। অন্য টেবিলে এফকে নির্ভরতা থাকায় আমি এটি করেছি যা এটিকে আরও কঠিন করে তুলেছে:

আমি এই ক্যোয়ারীটি পরিচয়টি যাচ্ছিল তা যাচাই করার জন্য এবং টেবিলে নির্ভরতা দেখতে ব্যবহার করেছি।

১) একটি টেবিলে পরিসংখ্যান সন্ধান করুন:

exec sp_help 'dbo.table_name_old';

২) পিকে ক্ষেত্র যেখানে আগে ছিল সেখানে একটি পরিচয় ক্ষেত্র যুক্ত করা ছাড়া একটি সদৃশ, অভিন্ন টেবিল তৈরি করুন।

৩) ডেটা স্থানান্তর করতে পরিচয় অক্ষম করুন।

SET IDENTITY_INSERT dbo.table_name ON 

৪) ডেটা স্থানান্তর করুন।

INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT 
field1, field2, etc...
FROM 
dbo.table_name_old;

5) তথ্য যাচাই করুন।

SELECT * FROM dbo.table_name_new

)) পরিচয়টি পুনরায় সক্ষম করুন।

SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF

).) কোন টেবিল (গুলি) মূল টেবিলটিকে নির্ভরতা হিসাবে উল্লেখ করে এবং আমি অনেকগুলি জুড়ে এসেছি তা যাচাই করার জন্য সমস্ত এফকে সম্পর্কগুলি খুঁজে পেয়েছি এটিই সেরা স্ক্রিপ্ট, তাই এটি রক্ষক!

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id
   ORDER BY ReferenceTableName;

৮) নিশ্চিত হয়ে নিন যে এই পদক্ষেপের আগে আপনার কাছে সমস্ত টেবিলের জন্য সমস্ত পিকে এবং এফকে স্ক্রিপ্ট রয়েছে।

9.) আপনি প্রতিটি কীতে ডান ক্লিক করতে পারেন এবং এসকিউএল সার্ভার 2008 ব্যবহার করে এটি স্ক্রিপ্ট করতে পারেন

১০) এই সিনট্যাক্সটি ব্যবহার করে নির্ভরতা টেবিল (গুলি) থেকে এফকে (গুলি) ফেলে দিন:

ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]

১১) আসল টেবিলটি ফেলে দিন:

DROP TABLE dbo.table_name_old;

13.) এই পরবর্তী পদক্ষেপগুলি 9 ম পদক্ষেপে আপনি এসকিউএল সার্ভার ২০০৮ সালে তৈরি স্ক্রিপ্টগুলির উপর নির্ভর করে।

- নতুন টেবিলে পিকে যোগ করুন।

- নতুন টেবিলে এফকে যুক্ত করুন।

- এফকে এর পিছনে নির্ভরতা টেবিল এ যুক্ত করুন।

14.) যাচাই করুন সমস্ত কিছু সঠিক এবং সম্পূর্ণ। আমি টেবিলগুলি দেখতে জিইউআই ব্যবহার করেছি।

15.) নতুন টেবিলটির মূল টেবিলের নামকরণ করুন।

exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';

অবশেষে, সবকিছু কাজ!


4

আপনি এটির মতো এটি করতে পারবেন না, আপনার আর একটি কলাম যুক্ত করতে হবে, মূল কলামটি ফেলে নতুন কলামটি নামকরণ করতে হবে বা একটি নতুন টেবিল তৈরি করতে হবে, তথ্যটি অনুলিপি করুন এবং পুরানো টেবিলটি পুরানোতে নতুন টেবিলটির নামকরণের পরে ফেলে দিন টেবিল

আপনি যদি এসএসএমএস ব্যবহার করেন এবং পরিচয় সম্পত্তিটি এখানে ডিজাইনারটিতে সেট করেন তবে এসকিউএল সার্ভার পর্দার আড়ালে কী করে। সুতরাং আপনার যদি [ব্যবহারকারী] নামের একটি সারণী থাকে তবে আপনি যদি ব্যবহারকারী আইডিআইডি এবং পরিচয় তৈরি করেন তবে এটিই ঘটে

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION

GO

GO
CREATE TABLE dbo.Tmp_User
    (
    UserID int NOT NULL IDENTITY (1, 1),
    LastName varchar(50) NOT NULL,
    FirstName varchar(50) NOT NULL,
    MiddleInitial char(1) NULL

    )  ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Tmp_User ON
GO
IF EXISTS(SELECT * FROM dbo.[User])
 EXEC('INSERT INTO dbo.Tmp_User (UserID, LastName, FirstName, MiddleInitial)
    SELECT UserID, LastName, FirstName, MiddleInitialFROM dbo.[User] TABLOCKX')
GO
SET IDENTITY_INSERT dbo.Tmp_User OFF
GO

GO
DROP TABLE dbo.[User]
GO
EXECUTE sp_rename N'dbo.Tmp_User', N'User', 'OBJECT'
GO
ALTER TABLE dbo.[User] ADD CONSTRAINT
    PK_User PRIMARY KEY CLUSTERED 
    (
    UserID
    ) ON [PRIMARY]

GO
COMMIT

এই বলে যে বিটওয়াইজ মানটি সেট করে এটি সম্পাদন করার জন্য সিস্টেম টেবিলটি হ্যাক করার একটি উপায় আছে তবে এটি সমর্থিত নয় এবং আমি এটি করব না


4

আমি যেমন সাধারণ ক্ষেত্রে বুঝেছি আমরা প্রাইমারি কী দিয়ে একটি টেবিল তৈরি করছি যা পরিচয় সম্পত্তি রয়েছে
তাই একটি প্রাথমিক স্তরের সীমাবদ্ধতার সাথে সম্পর্কিত একটি কলামের নাম পরিবর্তন বা মুছুন সম্ভব হবে না কারণ সীমাবদ্ধতা বিধিমালা কলামের কাঠামোকে বৈধতা দিচ্ছে। এটি অর্জনের জন্য আমাদের কয়েকটি পদক্ষেপ নিম্নলিখিত পদ্ধতিতে প্রক্রিয়াকরণ করতে হবে: আসুন আমরা টেবিলনাম = 'কর্মচারী' এবং কলামনাম = 'কর্মচারী আইডি ' ধরে নিই। ১. 'কর্মচারী' সারণীতে নতুন কর্মসূচী 'কর্মচারী আইডি_নেইউ' যুক্ত করুন কর্মচারী যোগ করুন কর্মচারী আইডি_নিউ INT পরিচয় ( 1,1)




  1. এখন 'কর্মচারী' টেবিল থেকে 'কর্মচারী আইডি ' কলামটি সরান
    টেবিল কর্মচারী ড্রপ কলঙ্ক কর্মচারী

  2. এটি ত্রুটি ছুঁড়ে দেবে কারণ প্রাথমিক কী বাধা নিয়ম প্রযোজ্য এবং কলাম স্ট্রাকচারকে বৈধতা দিচ্ছে।
    * ### ' এমএসজি 5074, স্তর 16, রাজ্য 1, লাইন 1 অবজেক্ট [পিকে_ডবো.এম্পলোয়েই] কলম্যান [এমপ্লয়িআইডি] এর উপর নির্ভরশীল।' ###

  3. সুতরাং আমাদের প্রথমে 'কর্মচারী' সারণী থেকে প্রাথমিক কী বাধাটি সরিয়ে ফেলতে হবে তারপরে আমরা ALTER TABLE কর্মচারী ড্রপ সীমাবদ্ধতা [PK_dbo.Employee] কলামটি সরিয়ে ফেলতে
    পারি]

  4. আগের পদক্ষেপের মতো এখন আমরা 'কর্মচারী' টেবিল থেকে 'কর্মচারী আইডি' কলামটি সরিয়ে ফেলতে পারি যেখানে আমাদের ত্রুটি হয়েছে
    টেবিল কর্মচারী ড্রপ কলম কর্মচারীআইডি

  5. এখন কলাম 'কর্মচারী আইডি' সারণী থেকে সরানো হয়েছে তাই আমরা নতুন সংযুক্ত নতুন কলাম 'কর্মচারী
    আইডি_নিউ' নামকরণ করব 'কর্মচারী আইডি' এসপি_নাম 'কর্মচারী.এম্পলয়েইড', 'কর্মচারীআইডি_নিউ', 'কলম' দিয়ে

  6. টেবিলটি যেমন ছিল ঠিক তেমনভাবে পুনরায় সাজানোর জন্য, আমাদেরকে 'কর্মচারী আইডি ' কলামের জন্য প্রাথমিক কী
    বাধা যুক্ত করতে হবে কর্মচারী সীমাবদ্ধকরণ [পিকে_ডাবো.এম্পলয়ে] প্রাথমিক কী (কর্মচারী) যোগ করতে হবে

৮. এখন 'কর্মচারী আইডি' সহ সারণী 'কর্মচারী' বিদ্যমান প্রাথমিক কী সীমাবদ্ধতার পাশাপাশি সনাক্তকরণের নিয়মের জন্য সংশোধিত হয়েছে


3

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

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

পরিবর্তনটি করতে ম্যানেজমেন্ট স্টুডিওটি ব্যবহার করুন এবং তারপরে ডিজাইনারে ডান ক্লিক করুন এবং "পরিবর্তন স্ক্রিপ্ট উত্পন্ন করুন" নির্বাচন করুন।

আপনি দেখতে পাবেন যে এটি ব্যাকগ্রাউন্ডে এসকিউএল সার্ভারটি করছে।


2

দুঃখজনকভাবে একটিও নেই; আইডেন্টিটি সম্পত্তি কলামের চেয়ে টেবিলের অন্তর্ভুক্ত।

সহজ উপায় হ'ল এটি জিইউআইতে করা, তবে এটি কোনও বিকল্প না হলে আপনি তথ্য অনুলিপি করতে, কলামটি ফেলে দিয়ে, পরিচয় দিয়ে পুনরায় যুক্ত করতে এবং ডেটা পিছনে রাখার পক্ষে দীর্ঘ পথ যেতে পারেন।

একটি ধাক্কা দিয়ে অ্যাকাউন্টের জন্য এখানে দেখুন ।


2

অবজেক্ট এক্সপ্লোরারে টেবিলের নামটিতে ডান ক্লিক করুন। আপনি কিছু বিকল্প পাবেন। 'ডিজাইন' এ ক্লিক করুন। এই টেবিলের জন্য একটি নতুন ট্যাব খোলা হবে। আপনি এখানে 'কলামের সম্পত্তি' এ পরিচয়ের সীমাবদ্ধতা যুক্ত করতে পারেন।


2

একটি কলামের জন্য পরিচয় বৈশিষ্ট্যগুলি পরিবর্তন করতে:

  • সার্ভার এক্সপ্লোরার-এ, আপনি যে পরিচয় বৈশিষ্ট্যগুলি সংশোধন করতে চান তার সাথে সারণীতে ডান ক্লিক করুন এবং সারণি সংজ্ঞাটি খুলুন ক্লিক করুন। টেবিলটি টেবিল ডিজাইনার খোলে।
  • আপনি যে কলামটি পরিবর্তন করতে চান তার জন্য নালকে মঞ্জুর করুন চেক বক্স সাফ করুন।
  • কলাম বৈশিষ্ট্য ট্যাবে, পরিচয় উল্লেখের বৈশিষ্ট্যটি প্রসারিত করুন।
  • শিশু পরিচয় সম্পত্তি হিসাবে গ্রিড ঘরে ক্লিক করুন এবং ড্রপ-ডাউন তালিকা থেকে হ্যাঁ চয়ন করুন।
  • পরিচয় বীজ ঘরে একটি মান টাইপ করুন। এই মানটি সারণীতে প্রথম সারিতে নির্ধারিত হবে। মান 1 ডিফল্টরূপে নির্ধারিত হবে।

এটিই আমার পক্ষে কাজ করে


2

যদি আপনি ভিজ্যুয়াল স্টুডিও 2017+ ব্যবহার করেন

  1. সার্ভার অবজেক্ট এক্সপ্লোরারে আপনার টেবিলটিতে ডান ক্লিক করুন এবং "কোড দেখুন" নির্বাচন করুন
  2. আপনার কলামে সংশোধক "পরিচয়" যুক্ত করুন
  3. হালনাগাদ

এটি আপনার পক্ষে এটি করবে।


হ্যাঁ! এই পরামর্শ দেওয়ার জন্য আপনাকে ধন্যবাদ! আমার উইন্ডোজ box বাক্সে এসএসএমএসের একটি সংস্করণ নেই যা আমাকে আমার প্রোডাকশন সার্ভারে টেবিলগুলিতে ডিজাইন পরিবর্তন করতে দেয় কারণ এটি ২০১ it, আমার এসএসএমএস ২০১৪, এবং এসএসএমএসের জন্য উইন্ডোজ ১০ দরকার। আপনি আমার দিনটি তৈরি করেছেন। ভিএস 2017 এ গেছে> সার্ভার এক্সপ্লোরার> এসকিউএল সার্ভারের> প্রোডাকশনের সাথে একটি নতুন সংযোগ তৈরি করেছে> টেবিলের ডান ক্লিক করুন> "সারণীর সংজ্ঞাটি খুলুন"> ওয়ালা!
জাস্টজহান

প্রকৃতপক্ষে, আমি পেয়েছি আপনি মাঠে ডানদিকে ক্লিক করতে পারেন এবং সম্পত্তি নির্বাচন করতে পারেন এবং সেখানে হ্যাঁ বা না বেছে নেওয়ার জন্য পরিচয় তৈরি করতে পারেন
জাস্টজহান

1

যদি মূল পোস্টারটি একটি বিদ্যমান কলামটি PRIMARY KEYটেবিলের জন্য একটি হিসাবে সেট করতে চাইছিল এবং আসলে কলামটি IDENTITYকলাম (দুটি পৃথক জিনিস) হওয়ার দরকার পড়েনি তবে এটি টি-এসকিউএল এর মাধ্যমে করা যেতে পারে:

ALTER TABLE [YourTableName]
ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey])

PRIMARY KEYবিকল্পের পরে কলামের নামের চারপাশে প্রথম বন্ধনী নোট করুন ।

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


1

আমার বর্তমান অবস্থা অনুসারে, আমি এই পদ্ধতির অনুসরণ করি। স্ক্রিপ্টের মাধ্যমে ডেটা afterোকানোর পরে আমি একটি প্রাথমিক টেবিলে পরিচয় দিতে চাই।

আমি যেমন পরিচয় সংযোজন করতে চাই, তাই এটি সর্বদা 1 থেকে শুরু করে রেকর্ড গণনার শেষ পর্যন্ত আমি চাই I

--first drop column and add with identity
ALTER TABLE dbo.tblProductPriceList drop column ID 
ALTER TABLE dbo.tblProductPriceList add ID INT IDENTITY(1,1)

--then add primary key to that column (exist option you can ignore)
IF  NOT EXISTS (SELECT * FROM sys.key_constraints  WHERE object_id = OBJECT_ID(N'[dbo].[PK_tblProductPriceList]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblProductPriceList]'))
    ALTER TABLE [tblProductPriceList] ADD PRIMARY KEY (id)
GO

এটি পরিচয় সহ একই প্রাথমিক কী কলামটি তৈরি করবে

আমি এই লিঙ্কগুলি ব্যবহার করেছি: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table- after- creating-table/

বিদ্যমান সারণীতে প্রাথমিক কী যুক্ত করুন


0

আমি বিশ্বাস করি না আপনি tsql ব্যবহার করে একটি বিদ্যমান কলামকে পরিচয় কলাম হিসাবে পরিবর্তন করতে পারবেন। তবে আপনি এন্টারপ্রাইজ ম্যানেজার ডিজাইন ভিউয়ের মাধ্যমে এটি করতে পারেন।

বিকল্পভাবে আপনি পরিচয় কলাম হিসাবে একটি নতুন সারি তৈরি করতে পারেন, পুরানো কলামটি ফেলে দিতে পারেন, তারপরে আপনার নতুন কলামটির নাম পরিবর্তন করতে পারেন।

ALTER TABLE FooTable
ADD BarColumn INT IDENTITY(1, 1)
               NOT NULL
               PRIMARY KEY CLUSTERED

2
মনে রাখবেন যে আপনি যদি এটি এসএসএমএস / এন্টারপ্রাইজ ম্যানেজারের মাধ্যমে করেন - আপনি একটি নতুন টেবিল তৈরি করবেন, ডেটা অনুলিপি করবেন, পুরানো টেবিলটি বাদ দেবেন এবং নতুনটির নামকরণ করবেন। আপনার কাছে বড় টেবিল থাকলে এটি বেশ ব্যয়বহুল হতে পারে ...
স্কট আইভে

0

মূলত চারটি যৌক্তিক পদক্ষেপ রয়েছে।

  1. একটি নতুন পরিচয় কলাম তৈরি করুন। এই নতুন কলামটির জন্য পরিচয় সন্নিবেশ চালু করুন।

  2. উত্স কলাম (আপনি যে কলামটি পরিচয় রূপান্তর করতে চান) থেকে এই নতুন কলামে ডেটা .োকান।

  3. নতুন কলামের জন্য সন্নিবেশ পরিচয় বন্ধ করুন।

  4. আপনার উত্স কলামটি ড্রপ করুন এবং উত্স কলামের নামে নতুন কলামটির নতুন নাম দিন।

আরও কিছু জটিলতা থাকতে পারে যেমন একাধিক সার্ভার জুড়ে কাজ করা ইত্যাদি

পদক্ষেপগুলির জন্য দয়া করে নীচের নিবন্ধটি পড়ুন (এসএমএস এবং টি-এসকিএল ব্যবহার করে)। এই পদক্ষেপগুলি টি-এসকিউএল-তে কম গ্রিপ সহ নতুনদের জন্য উদ্দিষ্ট intended

http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx


0

প্রাথমিক কী = বিগিন্ট সহ সমস্ত সারণীর জন্য একটি স্ক্রিপ্ট তৈরি করে যার পরিচয় সেট নেই; এটি প্রতিটি সারণীর সাথে উত্পন্ন স্ক্রিপ্টগুলির একটি তালিকা ফিরিয়ে দেবে;

SET NOCOUNT ON;

declare @sql table(s varchar(max), id int identity)

DECLARE @table_name nvarchar(max),
        @table_schema nvarchar(max);

DECLARE vendor_cursor CURSOR FOR 
SELECT
  t.name, s.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
WHERE EXISTS (
    SELECT
    [c].[name]
    from sys.columns [c]
    join sys.types [y] on [y].system_type_id = [c].system_type_id
    where [c].[object_id] = [t].[object_id] and [y].name = 'bigint' and [c].[column_id] = 1
) and NOT EXISTS 
(
  SELECT 1 FROM sys.identity_columns
    WHERE [object_id] = t.[object_id]
) and exists (
    select 1 from sys.indexes as [i] 
    inner join sys.index_columns as [ic]  ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
    where object_name([ic].[object_id]) = [t].[name]
)
OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor 
INTO @table_name, @table_schema

WHILE @@FETCH_STATUS = 0
BEGIN

DELETE FROM @sql

declare @pkname varchar(100),
    @pkcol nvarchar(100)

SELECT  top 1
        @pkname = i.name,
        @pkcol = COL_NAME(ic.OBJECT_ID,ic.column_id)
FROM    sys.indexes AS [i]
INNER JOIN sys.index_columns AS [ic] ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
WHERE   i.is_primary_key = 1 and OBJECT_NAME(ic.OBJECT_ID) = @table_name

declare @q nvarchar(max) = 'SELECT  '+@pkcol+' FROM ['+@table_schema+'].['+@table_name+'] ORDER BY '+@pkcol+' DESC'

DECLARE @ident_seed nvarchar(max) -- Change this to the datatype that you are after
SET @q = REPLACE(@q, 'SELECT', 'SELECT TOP 1 @output = ')
EXEC sp_executeSql @q, N'@output bigint OUTPUT', @ident_seed OUTPUT

insert into  @sql(s) values ('BEGIN TRANSACTION')
insert into  @sql(s) values ('BEGIN TRY')

-- create statement
insert into  @sql(s) values ('create table ['+@table_schema+'].[' + @table_name + '_Temp] (')

-- column list
insert into @sql(s) 
select 
    '  ['+[c].[name]+'] ' +
    y.name + 

    (case when [y].[name] like '%varchar' then
    coalesce('('+(case when ([c].[max_length] < 0 or [c].[max_length] >= 1024) then 'max' else cast([c].max_length as varchar) end)+')','')
    else '' end)

     + ' ' +
    case when [c].name = @pkcol then 'IDENTITY(' +COALESCE(@ident_seed, '1')+',1)' else '' end + ' ' +
    ( case when c.is_nullable = 0 then 'NOT ' else '' end ) + 'NULL ' + 
    coalesce('DEFAULT ('+(
        REPLACE(
            REPLACE(
                LTrim(
                    RTrim(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        LTrim(
                                            RTrim(
                                                REPLACE(
                                                    REPLACE(
                                                        object_definition([c].default_object_id)
                                                    ,' ','~')
                                                ,')',' ')
                                            )
                                        )
                                    ,' ','*')
                                ,'~',' ')
                            ,' ','~')
                        ,'(',' ')
                    )
                )
            ,' ','*')
        ,'~',' ')
    ) +
    case when object_definition([c].default_object_id) like '%get%date%' then '()' else '' end
    +
    ')','') + ','
 from sys.columns c
 JOIN sys.types y ON y.system_type_id = c.system_type_id
  where OBJECT_NAME(c.[object_id]) = @table_name and [y].name != 'sysname'
 order by [c].column_id


 update @sql set s=left(s,len(s)-1) where id=@@identity

-- closing bracket
insert into @sql(s) values( ')' )

insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] ON')

declare @cols nvarchar(max)
SELECT @cols = STUFF(
    (
        select ',['+c.name+']'
        from sys.columns c
        JOIN sys.types y ON y.system_type_id = c.system_type_id
        where c.[object_id] = OBJECT_ID(@table_name)
        and [y].name != 'sysname'
        and [y].name != 'timestamp'
        order by [c].column_id
        FOR XML PATH ('')
     )
    , 1, 1, '')

insert into @sql(s) values( 'IF EXISTS(SELECT * FROM ['+@table_schema+'].['+@table_name+'])')
insert into @sql(s) values( 'EXEC(''INSERT INTO ['+@table_schema+'].['+@table_name+'_Temp] ('+@cols+')')
insert into @sql(s) values( 'SELECT '+@cols+' FROM ['+@table_schema+'].['+@table_name+']'')')

insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] OFF')


insert into @sql(s) values( 'DROP TABLE ['+@table_schema+'].['+@table_name+']')

insert into @sql(s) values( 'EXECUTE sp_rename N''['+@table_schema+'].['+@table_name+'_Temp]'', N'''+@table_name+''', ''OBJECT''')

if ( @pkname is not null ) begin
    insert into @sql(s) values('ALTER TABLE ['+@table_schema+'].['+@table_name+'] ADD CONSTRAINT ['+@pkname+'] PRIMARY KEY CLUSTERED (')
    insert into @sql(s)
        select '  ['+COLUMN_NAME+'] ASC,' from information_schema.key_column_usage
        where constraint_name = @pkname
        GROUP BY COLUMN_NAME, ordinal_position
        order by ordinal_position

    -- remove trailing comma
    update @sql set s=left(s,len(s)-1) where id=@@identity
    insert into @sql(s) values ('  )')
end

insert into  @sql(s) values ('--Run your Statements')
insert into  @sql(s) values ('COMMIT TRANSACTION')
insert into  @sql(s) values ('END TRY')
insert into  @sql(s) values ('BEGIN CATCH')
insert into  @sql(s) values ('        ROLLBACK TRANSACTION')
insert into  @sql(s) values ('        DECLARE @Msg NVARCHAR(MAX)  ')
insert into  @sql(s) values ('        SELECT @Msg=ERROR_MESSAGE() ')
insert into  @sql(s) values ('        RAISERROR(''Error Occured: %s'', 20, 101,@msg) WITH LOG')
insert into  @sql(s) values ('END CATCH')

declare @fqry nvarchar(max)

-- result!
SELECT @fqry = (select char(10) + s from @sql order by id FOR XML PATH (''))


SELECT @table_name as [Table_Name], @fqry as [Generated_Query]
PRINT 'Table: '+@table_name
EXEC sp_executeSql @fqry

    FETCH NEXT FROM vendor_cursor 
    INTO @table_name, @table_schema
END 
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.