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

时间:2016-02-27 09:22:47

标签: sql sql-server copy

我编写了一个查询,将表的结构从一个表复制到sql server中的另一个表。

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

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

2 个答案:

答案 0 :(得分:2)

可以右键单击表格 - > 脚本表为 - >创建脚本 - >新查询窗口

您拥有所有约束/键作为原始表。在新数据库中运行脚本。

当然,这只是处理少数几个表时的解决方案,因为如果必须手动为多个表重复它,它会变得笨拙。

答案 1 :(得分:2)

我写了一个SP到"克隆"一张桌子。 但它还没有完成,因为我还不需要更多。

脚本将复制主键但不复制其他约束,如果要完成脚本,则必须遵循相同的逻辑。 您可以使用sys.sp_fkeys,sys.sp_indexes(...)来完成它。

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

之前你需要知道一件事。 在SQL Server中,约束名在数据库中必须是唯一的,因此您无法克隆具有相同约束名的表。

如果有人想完成并再次分享,欢迎他! 您必须使用自己的值更改DATABASE_NAME和YOUR_SCHEMA。

如果您只想要没有数据的结构,您可以添加" 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

启动sp:

 EXEC sp_CloneTable 'new_table_name', 'old_table_name', 'your_schema - dbo by default', 'your_db'