আমি কীভাবে নির্বাচনের সাথে একটি টেবিলটি অনুলিপি করব তবে পরিচয়ের সম্পত্তিটিকে অগ্রাহ্য করব?


41

আমার পরিচয় কলাম সহ একটি টেবিল রয়েছে:

create table with_id (
 id int identity(1,1),
 val varchar(30)
);

এটি সুপরিচিত, এটি

select * into copy_from_with_id_1 from with_id;

আইডিতে সনাক্তকরণ সহ অনুলিপি_ফ্রমে_ও_আইডি_এর ফলাফল।

নিম্নলিখিত স্ট্যাক ওভারফ্লো প্রশ্নে সমস্ত কলামকে সুস্পষ্টভাবে তালিকাভুক্ত করা উল্লেখ করা হয়েছে।

চেষ্টা করা যাক

select id, val into copy_from_with_id_2 from with_id;

উফ, এমনকি এই ক্ষেত্রে আইডি একটি পরিচয় কলাম।

আমি যা চাই তা একটি টেবিলের মতো

create table without_id (
 id int,
 val varchar(30)
);

উত্তর:


52

অনলাইন বই থেকে

নতুন তালিকার বিন্যাসটি নির্বাচিত তালিকার এক্সপ্রেশনগুলি মূল্যায়ন করে নির্ধারিত হয়। New_table এ কলামগুলি নির্বাচন তালিকাটি নির্দিষ্ট করে ক্রমে তৈরি করা হয়েছে। New_table এর প্রতিটি কলামের নির্বাচন তালিকাতে সংশ্লিষ্ট অভিব্যক্তি হিসাবে একই নাম, উপাত্তের ধরণ, নালিয়াযোগ্যতা এবং মান রয়েছে। একটি কলামের পরিচয় সম্পত্তি মন্তব্য বিভাগে "পরিচয় কলামগুলির সাথে কাজ করা" সংজ্ঞায়িত শর্তাবলী ব্যতীত স্থানান্তরিত হয়

পৃষ্ঠাটি নীচে:

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

  • নির্বাচনী বিবৃতিতে একটি যোগদান, দফা বা সমষ্টিগত ফাংশন সহ গ্রুপ থাকে।
  • ইউনিয়ন ব্যবহার করে একাধিক নির্বাচিত বিবৃতি যোগ দেওয়া হয়েছে।
  • পরিচয় কলামটি নির্বাচন তালিকায় একাধিকবার তালিকাবদ্ধ রয়েছে।
  • পরিচয় কলাম একটি অভিব্যক্তির অংশ।
  • সনাক্তকরণ কলামটি একটি দূরবর্তী ডেটা উত্স থেকে।

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

সুতরাং ... আপনি তাত্ত্বিকভাবে এড়িয়ে যেতে পারেন:

select id, val 
into copy_from_with_id_2 
from with_id

union all

select 0, 'test_row' 
where 1 = 0;

এটি ব্যাখ্যা করার জন্য এই কোডটি মন্তব্য করা গুরুত্বপূর্ণ হবে, তা না হলে পরের বার কেউ যদি এটি দেখে তবে এটি সরিয়ে ফেলা হবে।


29

এরিকস উত্তরের দ্বারা অনুপ্রাণিত হয়ে আমি নিম্নলিখিত সমাধানগুলি পেয়েছি যা কেবলমাত্র টেবিলের নামের উপর নির্ভর করে এবং কোনও নির্দিষ্ট কলামের নাম ব্যবহার করে না:

select * into without_id from with_id where 1 = 0
union all
select * from with_id where 1 = 0
;
insert into without_id select * from with_id;

সম্পাদন করা

এটিতে উন্নতি করা এমনকি সম্ভব

select * into without_id from with_id
union all
select * from with_id where 1 = 0
;

13

আপনি একসাথে নতুন টেবিল তৈরি করতে এবং পপুলেট করতে একটি যোগদান ব্যবহার করতে পারেন:

SELECT
  t.*
INTO
  dbo.NewTable
FROM
  dbo.TableWithIdentity AS t
  LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;

1 = 0শর্তের কারণে, ডান পাশের কোনও মিল নেই এবং এভাবে বাম পাশের সারিগুলির সদৃশতা প্রতিরোধ করা হবে এবং এটি বাহ্যিক জোড় হওয়ায় বাম পাশের সারিগুলিও মুছে ফেলা হবে না। অবশেষে, এটি একটি যোগদানের কারণে, পরিচয় সম্পত্তিটি মুছে ফেলা হবে।

কেবলমাত্র বাম দিকের কলামগুলি নির্বাচন করা, কেবলমাত্র dbo.TableWithIdentity ডেটা-ভিত্তিক, যেমন পরিচয় সম্পত্তিটি ছিনতাইয়ের সাথে একটি অনুলিপি তৈরি করবে produce

যা যা বলা হচ্ছে, ম্যাক্স ভার্নন একটি মন্তব্যে একটি বৈধ পয়েন্ট উত্থাপন করেছেন যা মাথায় রাখার মতো। উপরের ক্যোয়ারির এক্সিকিউশন প্ল্যানটি যদি আপনি দেখেন:

হত্যা পরিকল্পনা

আপনি লক্ষ্য করবেন যে উত্স সারণীটি একবারে কার্যকর করার পরিকল্পনায় উল্লেখ করা হয়েছে। অপরটি উদাহরণটি অপটিমাইজার দ্বারা মুছে ফেলা হয়েছে।

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

তবে ypercubeᵀᴹ দ্বারা যথাযথভাবে উল্লেখ করা হয়েছে , এখনও পর্যন্ত ম্যানুয়ালটি স্পষ্ট করে জানিয়েছে যে এখানে যদি যোগ দেওয়া হয় তবে পরিচয়ের সম্পত্তি সংরক্ষণ করা হয় না:

যখন কোনও বিদ্যমান পরিচয় কলামটি একটি নতুন টেবিলের মধ্যে নির্বাচন করা হয়, নতুন কলাম আইডেন্টিটি সম্পত্তি হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, [...] [টি] যদি সে নির্বাচনী বিবৃতিতে যোগদান না করে।

সুতরাং, যতক্ষণ না ম্যানুয়ালটি এটি উল্লেখ করে চলেছে, আমরা সম্ভবত আশ্বাস দিতে পারি যে আচরণটি একই রকম থাকবে।

যশ Shaneis এবং ypercubeᵀᴹ চ্যাটে একটি সম্পর্কিত বিষয় আনার জন্য।


JOIN (SELECT 1) AS dummy ON 1 = 1কাজ করবে ?
ypercubeᵀᴹ


5

এই কোডটি ব্যবহার করে দেখুন ..

SELECT isnull(Tablename_old.IDENTITYCOL + 0, -1) AS 'New Identity Column'
INTO   dbo.TableName_new
FROM   dbo.TableName_old 

ISNULLকল নিশ্চিত করে যে নতুন কলাম সঙ্গে তৈরি করা হয় NOT NULLnullability।


1
এটা কি ISNULL()বা +0এটা আছে যে? নাকি দুজনেরই দরকার?
ypercubeᵀᴹ

3

কেবল একটি ভিন্ন উপায় দেখানোর জন্য:

আপনি একটি লিঙ্কযুক্ত সার্ভার ব্যবহার করতে পারেন ।

SELECT * 
INTO without_id 
FROM [linked_server].[source_db].dbo.[with_id];

আপনি এটি ব্যবহার করে অস্থায়ীভাবে স্থানীয় সার্ভারের সাথে একটি লিঙ্কযুক্ত সার্ভার তৈরি করতে পারেন:

DECLARE @LocalServer SYSNAME 
SET @LocalServer = @@SERVERNAME;
EXEC master.dbo.sp_addlinkedserver @server = N'localserver'
    , @srvproduct = ''
    , @provider = 'SQLNCLI'
    , @datasrc = @LocalServer;
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'localserver'
    , @useself = N'True'
    , @locallogin = NULL
    , @rmtuser = NULL
    , @rmtpassword = NULL;

কোন পর্যায়ে আপনি select * intoকোডটি চালাবেন , localserverলিঙ্কযুক্ত সার্ভারটি চার-অংশের নাম উল্লেখ করে :

SELECT * 
INTO without_id 
FROM [localserver].[source_db].dbo.[with_id];

এটি সম্পূর্ণ হওয়ার পরে, এটির localserverসাথে লিঙ্কযুক্ত সার্ভারটি পরিষ্কার করুন :

EXEC sp_dropserver @server = 'localserver'
    , @droplogins = 'droplogins';

অথবা, আপনি OPENQUERYসিনট্যাক্স ব্যবহার করতে পারেন

SELECT * 
INTO without_id 
FROM OPENQUERY([linked_server], 'SELECT * FROM [source_db].dbo.[with_id]');

1

যদি নির্বাচনের বিবৃতিতে একটি যোগ থাকতে পারে, এবং পরিচয় সম্পত্তি হস্তান্তরিত হয় না

select a.* into without_id from with_id a inner join with_id b on 1 = 0;

পছন্দসই আচরণটিও দেবে ( সম্পত্তিটি idনা রাখার জন্য অনুলিপি করা কলামের IDENTITY

insert into without_id select * from with_id;

(ধন্যবাদ আকাশম!)


1

সহজ উপায় হ'ল কলামটি একটি অভিব্যক্তির অংশ করা।

উদাহরণ:
যদি টেবিল dbo.Employee আইডি কলামে একটি পরিচয় থাকে তবে নীচের উদাহরণে টেম্প টেবিল # টি আইডি কলামেও একটি পরিচয় থাকবে।

--temp table has IDENTITY
select ID, Name 
into #t
from dbo.Employee

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

--no IDENTITY
select ID = ID + 0, Name 
into #t
from dbo.Employee

অন্যান্য ডেটা ধরণের জন্য এক্সপ্রেশনগুলির অন্যান্য উদাহরণগুলির মধ্যে অন্তর্ভুক্ত থাকতে পারে: রূপান্তর (), স্ট্রিং কনকেন্টেশন বা ইসনুল ()


1
ডকস.মাইক্রোসফট.এইন / ইউএস / এসকিএল / টি- এসকিএল / ক্যোয়ারীস /… থেকে : "যখন একটি বিদ্যমান পরিচয় কলামটি একটি নতুন টেবিলের মধ্যে নির্বাচন করা হয়, নিম্নলিখিত কন্ডিশনের একটিও সত্য না হলে নতুন কলাম আইডেন্টিটি সম্পত্তিটি অধিকার করে unless … পরিচয় কলাম একটি অভিব্যক্তির অংশ ... কলামটি আইডেন্টিটি সম্পত্তিটি উত্তরাধিকার সূত্রে প্রাপ্ত করার পরিবর্তে কিছু করা যায় না ”"
মঙ্গো

1

কখনও কখনও, আপনি এমন কোনও টেবিল থেকে সন্নিবেশ করতে চান যেখানে কলামটি পরিচয় ব্যবহার করে তৈরি করা হয়েছিল বা না থাকলে আপনি জানেন না (বা যত্ন)। এটি আপনার সাথে কাজ করছেন এমন একটি পূর্ণসংখ্যা কলামও নাও হতে পারে। এই ক্ষেত্রে, নিম্নলিখিতগুলি কাজ করবে:

SELECT TOP(0) ISNULL([col],NULL) AS [col], ... INTO [table2] FROM [table1]
ALTER TABLE [table2] REBUILD WITH (DATA_COMPRESSION=page)
INSERT INTO [table2] ...

ISNULL কলাম থেকে আইডেন্টিটি বৈশিষ্ট্যটি বাদ দেবে তবে এটি একই নামের সাথে sertোকাতে হবে এবং মূল কলাম হিসাবে টাইপ করবে এবং এটিকে আবশ্যক নয় make শীর্ষ (0) একটি খালি টেবিল তৈরি করবে যা আপনি এর পরে নির্বাচিত সারিগুলি sertোকাতে ব্যবহার করতে পারেন। প্রয়োজনে ডাটা সন্নিবেশ করার আগে আপনি টেবিলটি সংকুচিত করতে পারেন।


0
select convert(int, id) as id, val 
into copy_from_with_id_without_id 
from with_id;

পরিচয় মুছে ফেলবে।

idঅবক্ষয়টি হ'ল অবিরাম হয় তবে আপনি এই সীমাবদ্ধতাটি যুক্ত করতে পারেন।


1
আপনি এটি প্রায় পেতে ব্যবহার করতে পারেন ।
এরিক ডার্লিং

-2

আপনি না। select * intoপরিচয় সংরক্ষণ করে।


2
ব্যবহার করার প্রশ্নে কোনও প্রয়োজন ছিল না *
মার্টিন স্মিথ

2
এবং identityউত্তর সর্বদা সংরক্ষণ করা হয় না, যেমন অন্যান্য উত্তরগুলি নির্দেশ করে।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.