在sql server中将整个表结构从一个表复制到另一个表

在sql server中将整个表结构从一个表复制到另一个表,sql,sql-server,copy,Sql,Sql Server,Copy,我编写了一个查询,以便在SQLServer中将表的结构从一个表复制到另一个表 SELECT * INTO Database.Schema.TableNew FROM Database.Schema.OldTable WHERE 1=2 但通过该查询,我可以复制表的结构,但它不会复制校验和的函数值。解决方法是右键单击表->将表作为脚本->创建脚本->新建查询窗口 所有约束/关键点都与原始表相同。在新数据库中运行脚本 当然,只有在处理少数几个表时,这才是一种解决方案,因为如果必须对多个表手动重

我编写了一个查询,以便在SQLServer中将表的结构从一个表复制到另一个表

SELECT * INTO Database.Schema.TableNew 
FROM Database.Schema.OldTable 
WHERE 1=2

但通过该查询,我可以复制表的结构,但它不会复制校验和的函数值。

解决方法是右键单击表->将表作为脚本->创建脚本->新建查询窗口

所有约束/关键点都与原始表相同。在新数据库中运行脚本

当然,只有在处理少数几个表时,这才是一种解决方案,因为如果必须对多个表手动重复此操作,则会变得很笨拙。

我编写了一个SP来“克隆”一个表。 但它还没有完成,因为我不需要更多

脚本将复制主键,但不会复制其他约束,如果要完成脚本,只需遵循相同的逻辑。 您可以使用sys.sp_fkeys、sys.sp_索引(…)来执行此操作

我不知道是否有最好的方法,但这一种有效

你还需要知道一件事。 在SQL Server中,约束名称在数据库中必须是唯一的,因此不能克隆具有相同约束名称的表

如果有人想完成并再次分享,欢迎他! 您必须使用自己的值更改数据库名称和模式

如果只需要没有数据的结构,可以在复制结构请求的末尾添加“WHERE 1=2”

如果你在其他限制条件下没有成功,请不要犹豫

USE [DATABASE_NAME]
GO
/****** Object:  StoredProcedure [YOUR_SCHEMA].[sp_CloneTable]    Script Date: 29/04/2016 12:46:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [YOUR_SCHEMA].[sp_CloneTable]
    @new_table_name varchar (100),
    @old_table_name varchar(100),
    @table_owner varchar (100),
    @table_qualifier varchar (100)
AS

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

BEGIN TRANSACTION;

    DECLARE 
        @SQL varchar(200),
        @pkey_name varchar (100),
        @tmp_column_name varchar (150),
        @tmp_pk_name varchar (150);


    -- COPY STRUCTURE AND DATAS (except keys, constraint... etc)
    SET @SQL = 'SELECT * INTO ' + @table_owner + '.' + @new_table_name + ' FROM ' + @table_owner + '.' + @old_table_name;
    EXEC (@SQL);


    -- PRIMARY KEYS TABLE
    DECLARE @table_primary_keys TABLE (
        TABLE_QULIFER varchar(150),
        TABLE_OWNER varchar(150),
        TABLE_NAME varchar(150),
        COLUMN_NAME varchar(150),
        KEY_SEQ INT,
        PK_NAME varchar(150)
    )

    INSERT INTO @table_primary_keys EXEC sp_pkeys @old_table_name, @table_owner, @table_qualifier;

    -- Contrainst name
    SELECT @pkey_name = PK_NAME FROM @table_primary_keys GROUP BY PK_NAME;

    DECLARE cursor_primary_key CURSOR FOR
        SELECT COLUMN_NAME, PK_NAME FROM @table_primary_keys;

    OPEN cursor_primary_key;
    FETCH NEXT FROM cursor_primary_key INTO @tmp_column_name, @tmp_pk_name;

    SET @SQL = 'ALTER TABLE ' + @table_owner + '.' + @new_table_name + ' ADD CONSTRAINT pk_' + @new_table_name + ' PRIMARY KEY CLUSTERED ('; 
    WHILE @@FETCH_STATUS = 0
    BEGIN 
        IF @pkey_name <> @tmp_pk_name
        BEGIN;
            THROW 50000, 'Two primary keys differents.', 1;
        END;
        SET @SQL = @SQL + @tmp_column_name + ', ';

        FETCH NEXT FROM cursor_primary_key INTO @tmp_column_name, @tmp_pk_name;
    END
    SET @SQL = SUBSTRING(@SQL, 1, LEN(@SQL) - 1) + ')';

    EXEC (@SQL);

COMMIT TRANSACTION;
END

是否要将约束复制到新表中。如果是,则无法将
复制到
中,我想复制约束然后@evil333是正确的,但我想创建查询,因为我必须对多个表执行此操作这可能会有所帮助,
 EXEC sp_CloneTable 'new_table_name', 'old_table_name', 'your_schema - dbo by default', 'your_db'