বিদ্যমান সারণী থেকে টেবিল (কাঠামো) তৈরি করুন


103

নতুন টেবিলটি কীভাবে তৈরি করা যায় যা অন্য কাঠামোর মতো কাঠামোটি একই হওয়া উচিত

আমি চেষ্টা করেছিলাম

CREATE TABLE dom AS SELECT * FROM dom1 WHERE 1=2

তবে এটির কাজ না করে ত্রুটি ঘটেছে


সর্বদা মিথ্যা এমন একটি ধারা থাকা খুব আকর্ষণীয়, আগ্রহী!
জোসেফডোগি

উত্তর:


172

চেষ্টা করুন:

Select * Into <DestinationTableName> From <SourceTableName> Where 1 = 2

মনে রাখবেন যে এটি সূচি, কীগুলি ইত্যাদি অনুলিপি করবে না

আপনি যদি পুরো কাঠামোটি অনুলিপি করতে চান তবে আপনাকে সারণির একটি স্ক্রিপ্ট তৈরি করতে হবে। একই কাঠামো সহ একটি নতুন টেবিল তৈরি করতে আপনি সেই স্ক্রিপ্টটি ব্যবহার করতে পারেন। তারপরে আপনার প্রয়োজনের সাথে সাথে নতুন টেবিলে ডেটা ফেলে দিতে পারেন।

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


4
কেভিন, আপনার উত্তরে কেবল একটি ছোট ফর্ম্যাটিং পরিবর্তন: - <সূত্র টেবিলনাম> থেকে 1 তে 2 *
আশীষ গুপ্ত

6
কুতুবুদ্দিন, 1 = 2 উত্স থেকে গন্তব্য সারণিতে ডেটা অনুলিপি করা রোধ করবে। নিজেকে চেষ্টা করে দেখুন: - টেবিল তৈরি করুন টেবিল 1 (আইডি ইন্টি, নাম বর্ণাচা (200)) সারণি 1 ভ্যালুতে (1, 'এ') সারণি 1 ভ্যালুতে অন্তর্ভুক্ত করুন (2, 'বি') - টেবিল 1 নির্বাচন করে টেবিল 2 তৈরি করবে নির্বাচন করুন * টেবিল 1 থেকে টেবিল 2 যেখানে 1 = 2 - টেবিল 1 তে ডেটা ছাড়াই টেবিল 2 তৈরি করবে নির্বাচন করুন * টেবিল 1 থেকে টেবিল 2 কোথা থেকে 1 = 2
আশীষ গুপ্ত

আমি ভেবেছিলাম ডেটা অনুলিপি করা এড়াতে 1 = 2 হ'ল একটি অদ্ভুত ভুল যুক্তি।
আর্থার জেনিনিগ

45

এটি আমি টেবিলের কাঠামো ক্লোন করতে ব্যবহার করি (কেবলমাত্র কলাম) ...

SELECT TOP 0 *
INTO NewTable
FROM TableStructureIWishToClone

4
অতিরিক্ত শর্ত "1 = 2" থাকার চেয়ে এই সমাধানটি আরও পরিষ্কার, আমি এটির পরামর্শ দেব
পিন্টে ড্যানি

32

কাঠামো অনুলিপি করুন (সমস্ত কলাম অনুলিপি করুন)

Select Top 0 * into NewTable from OldTable

কাঠামো অনুলিপি করুন (কিছু কলাম কপি করুন)

Select Top 0 Col1,Col2,Col3,Col4,Col5 into NewTable from OldTable

ডেটা সহ কাঠামো অনুলিপি করুন

Select * into NewTable from OldTable

আপনার যদি ইতিমধ্যে একই কাঠামোযুক্ত একটি টেবিল থাকে এবং আপনি কেবল ডেটা অনুলিপি করতে চান তবে এটি ব্যবহার করুন

Insert into NewTable Select * from OldTable

এমএসএসকিউএল ২০০৮ আর
পাইরাইট

4
দুর্দান্ত সমাধান, সহজ এবং মার্জিত। এই অনুলিপি সূচকগুলি এবং প্রাথমিক কীগুলি তৈরি করার জন্য কি কোনও হ্যাক রয়েছে?
তুমনেই মোশা


14

মাইএসকিউএল এর জন্য:

তুমি ব্যবহার করতে পার:

CREATE TABLE foo LIKE bar;

ডকুমেন্টেশন এখানে


21
প্রশ্নটি ট্যাগ করা sql-serverহয়েছে যার জন্য এই সিনট্যাক্সটি বৈধ নয়, তাই।
মোলম্বি

এসকিউএল-সার্ভারে না মাইএসকিউএল সম্পর্কিত সম্পর্কের কারণে উত্তর হিসাবে গণনা করা উচিত নয়
celerno

4
এফওয়াইআই - এটি প্রাথমিক কী এবং সূচকগুলি ধরে রাখে।
garg10may

8

এটি সম্ভবত উল্লেখযোগ্য যে আপনি নিম্নলিখিতগুলি করতে পারেন:

ডানদিকের সারণী আপনি অনুরূপ চান সেটিতে ক্লিক করুন > স্ক্রিপ্ট টেবিল হিসাবে > তৈরি করতে > নতুন কোয়েরি সম্পাদক উইন্ডো

তারপরে, তৈরি হওয়া স্ক্রিপ্টে আপনি যে টেবিলটির ডানদিকে ক্লিক করেছেন তার নাম কোথায় রয়েছে, আপনি নিজের নতুন টেবিলটি কল করতে চাইলে নামটি পরিবর্তন করুন এবং ক্লিক করুন Execute


5

এটি ব্যবহার করে দেখুন .. নীচের একটিতে বিদ্যমান টেবিলের পুরো কাঠামোটি অনুলিপি করুন তবে ডেটা নয়।

create table AT_QUOTE_CART as select * from QUOTE_CART where 0=1 ;

আপনি যদি ডেটা অনুলিপি করতে চান তবে নীচেরটিটি ব্যবহার করুন:

create table AT_QUOTE_CART as select * from QUOTE_CART ;

5

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

    /*
        Clones a table's schema from an existing table (without data)
        if target table exists, it will be dropped first.
        The following schema elements are cloned:
            * Structure
            * Primary key
            * Indexes
            * Constraints
    DOES NOT copy:
        * Triggers
        * File groups

    ASSUMPTION: constraints are uniquely named with the table name, so that we dont end up with duplicate constraint names
*/
CREATE PROCEDURE [dbo].[spCloneTableStructure]

@SourceTable            nvarchar(255),
@DestinationTable       nvarchar(255),
@PartionField           nvarchar(255),
@SourceSchema           nvarchar(255) = 'dbo',  
@DestinationSchema      nvarchar(255) = 'dbo',    
@RecreateIfExists       bit = 1

AS
BEGIN

DECLARE @msg  nvarchar(200), @PartionScript nvarchar(255), @sql NVARCHAR(MAX)

    IF EXISTS(Select s.name As SchemaName, t.name As TableName
                        From sys.tables t
                        Inner Join sys.schemas s On t.schema_id = s.schema_id
                        Inner Join sys.partitions p on p.object_id = t.object_id
                        Where p.index_id In (0, 1) and t.name = @SourceTable
                        Group By s.name, t.name
                        Having Count(*) > 1)

        SET @PartionScript = ' ON [PS_PartitionByCompanyId]([' + @PartionField + '])'
    else
        SET @PartionScript = ''

SET NOCOUNT ON;
BEGIN TRY   
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 1, Drop table if exists. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
     RAISERROR( @msg,0,1) WITH NOWAIT
    --drop the table
    if EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @DestinationTable)
    BEGIN
        if @RecreateIfExists = 1
            BEGIN
                exec('DROP TABLE [' + @DestinationSchema + '].[' + @DestinationTable + ']')
            END
        ELSE
            RETURN
    END

    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 2, Create table. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    --create the table
    exec('SELECT TOP (0) * INTO [' + @DestinationTable + '] FROM [' + @SourceTable + ']')       

    --create primary key
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 3, Create primary key. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @PKSchema nvarchar(255), @PKName nvarchar(255),@count   INT
    SELECT TOP 1 @PKSchema = CONSTRAINT_SCHEMA, @PKName = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = @SourceSchema AND TABLE_NAME = @SourceTable AND CONSTRAINT_TYPE = 'PRIMARY KEY'
    IF NOT @PKSchema IS NULL AND NOT @PKName IS NULL
    BEGIN
        DECLARE @PKColumns nvarchar(MAX)
        SET @PKColumns = ''

        SELECT @PKColumns = @PKColumns + '[' + COLUMN_NAME + '],'
            FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
            where TABLE_NAME = @SourceTable and TABLE_SCHEMA = @SourceSchema AND CONSTRAINT_SCHEMA = @PKSchema AND CONSTRAINT_NAME= @PKName
            ORDER BY ORDINAL_POSITION

        SET @PKColumns = LEFT(@PKColumns, LEN(@PKColumns) - 1)

        exec('ALTER TABLE [' + @DestinationSchema + '].[' + @DestinationTable + '] ADD  CONSTRAINT [PK_' + @DestinationTable + '] PRIMARY KEY CLUSTERED (' + @PKColumns + ')' + @PartionScript);
    END

    --create other indexes
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 4, Create Indexes. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @IndexId int, @IndexName nvarchar(255), @IsUnique bit, @IsUniqueConstraint bit, @FilterDefinition nvarchar(max), @type int

    set @count=0
    DECLARE indexcursor CURSOR FOR
    SELECT index_id, name, is_unique, is_unique_constraint, filter_definition, type FROM sys.indexes WHERE is_primary_key = 0 and object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']')
    OPEN indexcursor;
    FETCH NEXT FROM indexcursor INTO @IndexId, @IndexName, @IsUnique, @IsUniqueConstraint, @FilterDefinition, @type
    WHILE @@FETCH_STATUS = 0
       BEGIN
            set @count =@count +1
            DECLARE @Unique nvarchar(255)
            SET @Unique = CASE WHEN @IsUnique = 1 THEN ' UNIQUE ' ELSE '' END

            DECLARE @KeyColumns nvarchar(max), @IncludedColumns nvarchar(max)
            SET @KeyColumns = ''
            SET @IncludedColumns = ''

            select @KeyColumns = @KeyColumns + '[' + c.name + '] ' + CASE WHEN is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END + ',' from sys.index_columns ic
            inner join sys.columns c ON c.object_id = ic.object_id and c.column_id = ic.column_id
            where index_id = @IndexId and ic.object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']') and key_ordinal > 0
            order by index_column_id

            select @IncludedColumns = @IncludedColumns + '[' + c.name + '],' from sys.index_columns ic
            inner join sys.columns c ON c.object_id = ic.object_id and c.column_id = ic.column_id
            where index_id = @IndexId and ic.object_id = object_id('[' + @SourceSchema + '].[' + @SourceTable + ']') and key_ordinal = 0
            order by index_column_id

            IF LEN(@KeyColumns) > 0
                SET @KeyColumns = LEFT(@KeyColumns, LEN(@KeyColumns) - 1)

            IF LEN(@IncludedColumns) > 0
            BEGIN
                SET @IncludedColumns = ' INCLUDE (' + LEFT(@IncludedColumns, LEN(@IncludedColumns) - 1) + ')'
            END

            IF @FilterDefinition IS NULL
                SET @FilterDefinition = ''
            ELSE
                SET @FilterDefinition = 'WHERE ' + @FilterDefinition + ' '

            SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 4.' + CONVERT(NVARCHAR(5),@count) + ', Create Index ' + @IndexName + '. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
            RAISERROR( @msg,0,1) WITH NOWAIT

            if @type = 2
                SET @sql = 'CREATE ' + @Unique + ' NONCLUSTERED INDEX [' + @IndexName + '] ON [' + @DestinationSchema + '].[' + @DestinationTable + '] (' + @KeyColumns + ')' + @IncludedColumns + @FilterDefinition  + @PartionScript
            ELSE
                BEGIN
                    SET @sql = 'CREATE ' + @Unique + ' CLUSTERED INDEX [' + @IndexName + '] ON [' + @DestinationSchema + '].[' + @DestinationTable + '] (' + @KeyColumns + ')' + @IncludedColumns + @FilterDefinition + @PartionScript
                END
            EXEC (@sql)
            FETCH NEXT FROM indexcursor INTO @IndexId, @IndexName, @IsUnique, @IsUniqueConstraint, @FilterDefinition, @type
       END
    CLOSE indexcursor
    DEALLOCATE indexcursor

    --create constraints
    SET @msg ='  CloneTable  ' + @DestinationTable + ' - Step 5, Create constraints. Timestamp: '  + CONVERT(NVARCHAR(50),GETDATE(),108)
    RAISERROR( @msg,0,1) WITH NOWAIT
    DECLARE @ConstraintName nvarchar(max), @CheckClause nvarchar(max), @ColumnName NVARCHAR(255)
    DECLARE const_cursor CURSOR FOR
        SELECT
            REPLACE(dc.name, @SourceTable, @DestinationTable),[definition], c.name
        FROM sys.default_constraints dc
            INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
        WHERE OBJECT_NAME(parent_object_id) =@SourceTable               
    OPEN const_cursor
    FETCH NEXT FROM const_cursor INTO @ConstraintName, @CheckClause, @ColumnName
    WHILE @@FETCH_STATUS = 0
       BEGIN
            exec('ALTER TABLE [' + @DestinationTable + '] ADD CONSTRAINT [' + @ConstraintName + '] DEFAULT ' + @CheckClause + ' FOR ' + @ColumnName)
            FETCH NEXT FROM const_cursor INTO @ConstraintName, @CheckClause, @ColumnName
       END;
    CLOSE const_cursor
    DEALLOCATE const_cursor                 


END TRY
    BEGIN CATCH
        IF (SELECT CURSOR_STATUS('global','indexcursor')) >= -1
        BEGIN
         DEALLOCATE indexcursor
        END

        IF (SELECT CURSOR_STATUS('global','const_cursor')) >= -1
        BEGIN
         DEALLOCATE const_cursor
        END


        PRINT 'Error Message: ' + ERROR_MESSAGE(); 
    END CATCH

END

GO

4
এটিকে দ্রুত করা আপনার কার্সার হিসাবে ঘোষণা করার মতোই সহজ হতে পারে CURSOR LOCAL FAST_FORWARD। ব্যক্তিগতভাবে আমি কার্সার ব্যবহার না করে একটি অনুরূপ স্ক্রিপ্ট তৈরি করার চেষ্টা করছি এবং দেখুন কীভাবে এটি সম্পাদন করে।
মেন্ডোসি

হাই হাইমেনডেসি আমি জানি এটি পুরানো, তবে আমি বর্তমানে কলাম সংজ্ঞা সহ সমস্ত বিবিধ জিনিস (সীমাবদ্ধতা / সূচি / পার্টিশন / ট্রিগার / ইত্যাদি) দিয়ে ক্রিট স্ক্রিপ্ট তৈরির দিকে নজর রাখছি। আমি ভাবছিলাম যে আপনার যদি কার্সার ছাড়াইহীন পদ্ধতির সাথে পুনরায় পুনরুদ্ধার করতে কোনও সাফল্য পান। যদি তাই হয়, আপনি কি এটি ভাগ করে নিতে হবে? অনেক প্রশংসা করেছেন, আপনাকে ধন্যবাদ
007

আমি যে স্ক্রিপ্টটি লিখেছি তা এক বা একাধিক টেবিলের অনুলিপি করে এবং কার্সার ব্যবহার করে না। এটি একটি মন্তব্যের জন্য খুব বড়। পরিবর্তে আমি হান্স মিশিলস
mendosi

4
  1. আপনি যদি একই ডেটাবেস অনুলিপি করতে চান

    Select * INTO NewTableName from OldTableName
    
  2. আরেকটি ডাটাবেস যদি

    Select * INTO NewTableName from DatabaseName.OldTableName
    


3

আপনি কেন এটি করতে চান তা আমি জানি না, তবে চেষ্টা করুন:

SELECT *
INTO NewTable
FROM OldTable
WHERE 1 = 2

এটি কাজ করা উচিত.


আমি মনে করি এটিও ডেটা অনুলিপি করবে? তিনি কেবল কাঠামো চান।
আশীষ গুপ্ত

@ আশিস গুপ্ত - ধন্যবাদ, আমি "কোথায়" ভুলে
গিয়েছি


2

আমি যা খুঁজছিলাম তা এখানে খুঁজে পেয়েছি। আমি 3-4 বছর আগে আমি কী ব্যবহার করেছি তা পুনরায় স্মরণে রাখতে সহায়তা করে।

কোনও টেবিলের যোগদানের ফলে ডেটা সহ টেবিল তৈরি করতে সক্ষম হতে আমি একই বাক্য গঠনটি পুনরায় ব্যবহার করতে চেয়েছিলাম।

কয়েকবার চেষ্টা করার পরে নীচে ক্যোয়ারী নিয়ে এসেছিল।

SELECT a.*
INTO   DetailsArchive
FROM   (SELECT d.*
        FROM   details AS d
               INNER JOIN
               port AS p
               ON p.importid = d.importid
        WHERE  p.status = 2) AS a;

0
SELECT * INTO newtable
from Oldtable

বৃহত্তর পাঠযোগ্যতার জন্য দয়া করে কোড মার্কআপ ব্যবহার করুন, এটি আপনার কোড সম্পর্কে কিছুটা ব্যাখ্যা করতেও বেশি কার্যকর।
নিমা ডেরাখশান

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

-1

আপনি যদি মূল টেবিল থেকে অনুলিপি করার জন্য একমাত্র কাঠামো সহ একটি টেবিল তৈরি করতে চান তবে তা করতে আপনি নীচের আদেশটি ব্যবহার করতে পারেন।

create table <tablename> as select * from <sourcetablename> where 1>2;

এই মিথ্যা শর্ত দ্বারা আপনি রেকর্ডগুলি ছেড়ে কাঠামোটি অনুলিপি করতে পারেন।


এটি বিদ্যমান উত্তরের সদৃশ। একটি নতুন জমা দেওয়ার আগে বিদ্যমান উত্তরগুলি পড়ুন এবং উপযুক্ত হলে মন্তব্য / ভোট যুক্ত করুন।
কেভিন হগ

তবে এটি বিদ্যমান উত্তরের মতো নয় তবে আমি এই ক্রিয়াটি করার জন্য কমান্ড তৈরি করতে ব্যবহার করেছি
সাই দুর্গা কামেশ কোটা

আপনি যদি @AbhiUrs উত্তর (02-জানু -2015) পর্যালোচনা করেন তবে আপনার উত্তরটি তাদের উত্তরের প্রথম অংশের মতো, যদিও কিছুটা ধারা থাকুক না কেন। প্রথম অংশ => create table AT_QUOTE_CART as select * from QUOTE_CART where 0=1 ; table টেবিলের নামগুলি প্রতিস্থাপন করুন এবং আমরা পেয়েছি: create table <tablename> as select * from <sourcetablename> where 0=1 ; যেখানে ক্লজ 0=1হিসাবে, একই ফলাফল অর্জন করে 1>2যা কোনও তথ্য পুনরুদ্ধার করা হয়নি।
কেভিন হগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.