2010-03-24 41 views
58

existente Cómo crear nueva tabla cuya estructura debe ser igual a otra mesaCrear una tabla (estructura) de la tabla

Probé

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

pero su error no trabaja producido

+0

muy útil, interesante para tener una cláusula where que siempre es falsa! – JosephDoggie

Respuesta

106

Probar:

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

Tenga en cuenta que esto no copiará índices, claves, etc.

Si desea copiar toda la estructura, debe generar un Crear secuencia de comandos de la tabla. Puede usar esa secuencia de comandos para crear una nueva tabla con la misma estructura. También puede volcar los datos en la nueva tabla si es necesario.

Si está utilizando Enterprise Manager, simplemente haga clic derecho en la tabla y seleccione copiar para generar un Create Script.

+0

Kevin, solo un pequeño cambio de formato en su respuesta: - Seleccione * Into From Donde 1 = 2 –

+0

@Ashish Solucionado, gracias. –

+7

¿por qué agregar aquí la cláusula 1 = 2 ??? – BreakHead

2
SELECT * 
INTO NewTable 
FROM OldTable 
WHERE 1 = 2 
3

No sé qué quiere hacer eso, pero trato:

SELECT * 
INTO NewTable 
FROM OldTable 
WHERE 1 = 2 

Se debe trabajar.

+0

Creo que también copiaría los datos? él solo quiere la estructura. –

+0

@Ashis Gupta - Gracias, olvidé el "dónde" :) –

1

Encontré aquí lo que estaba buscando. Me ayudó a recordar lo que utilicé hace 3-4 años.

Quería reutilizar la misma sintaxis para poder crear tablas con los datos resultantes de la unión de una tabla.

Llegó a la siguiente consulta después de unos pocos intentos.

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; 
16

Esto es lo que yo uso para clonar una estructura de tabla (sólo columnas) ...

SELECT TOP 0 * 
INTO NewTable 
FROM TableStructureIWishToClone 
9
Create table abc select * from def limit 0; 

Esto funcionará definida

8

Su probablemente también digno de mención que pueda haga lo siguiente:

Haga clic con el botón derecho en la tabla que desea duplicar > Guión tabla como > Crear Para > Nueva consulta ventana del editor de

Entonces, cuando se dice el nombre de la tabla que justo ha hecho clic en el guión que se ha generado, cambiar el nombre a cualquier cosa que quiera la nueva tabla que se llama y haga clic Execute

2
Copy the table structure:- 
select * into newtable from oldtable where 1=2; 

Copy the table structure along with table data:- 
select * into newtable from oldtable where 1=1; 
+2

esto no copia las restricciones y las claves – Trikaldarshi

3

probar esto .. el siguiente una copia de toda la estructura de la tabla existente, pero no los datos.

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

si desea copiar los datos a continuación, utilizar el siguiente uno:

create table AT_QUOTE_CART as select * from QUOTE_CART ; 
5

que puede utilizar:

CREATE TABLE foo LIKE bar; 

Documentation here.

+13

La pregunta está etiquetada como 'sql-server' para la cual esta sintaxis no es válida, fyi. – Molomby

+0

No debe contar como respuesta debido a la relación con MySQL no al servidor sql – celerno

14

estructura de copia única (copiar todas las columnas)

Select Top 0 * into NewTable from OldTable 
única

estructura Copy (copiar algunas columnas)

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

estructura de copia con datos

Select * into NewTable from OldTable 

Si ya tiene una tabla con la misma estructura y solo quiere copiar los datos, luego use este

Insert into NewTable Select * from OldTable 
+0

Funcionó para mí en MSSQL 2008 R2 – Pyrite

+0

Gran solución, simple y elegante. ¿Hay algún truco para hacer esta copia de índices y claves primarias también? –

2
  1. Si desea copiar misma base de datos

    Select * INTO NewTableName from OldTableName 
    
  2. Si otra base de datos

    Select * INTO NewTableName from DatabaseName.OldTableName 
    
3

utilizo el siguiente procedimiento almacenado para copiar el esquema de una tabla, que incluye PK, índices, estado de partición. No es muy rápido, pero parece hacer el trabajo. Me he bienvenida alguna idea de cómo acelerarlo:

/* 
     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 [email protected] +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) [email protected]    
    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 
+0

Hacer esto más rápido podría ser tan simple como declarar sus cursores como 'CURSOR LOCAL FAST_FORWARD'. Personalmente, intento crear una secuencia de comandos similar sin utilizar cursores y ver cómo funciona. – mendosi

-1
SELECT * INTO newtable 
from Oldtable 
+0

Utilice el código de marcado para una mayor legibilidad, también eso es más útil para explicar un poco sobre su código. –

+0

Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor educativo al mostrar * por qué * esta es una buena solución al problema, y ​​lo haría más útil para lectores futuros con similares, pero no idénticas, preguntas. En particular, mira al ojo no entrenado como si esto también copiara el contenido de 'Oldtable'. ¿Cómo se evita eso? –

Cuestiones relacionadas