我编写了一个查询,将表的结构从一个表复制到sql server中的另一个表。
SELECT * INTO Database.Schema.TableNew
FROM Database.Schema.OldTable
WHERE 1=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'