我寫了一個查詢來將表的結構從一個表複製到另一個sql server表中。在sql server中將整個表結構從一個表複製到另一個表
SELECT * INTO Database.Schema.TableNew
FROM Database.Schema.OldTable
WHERE 1=2
但通過該查詢,我能夠複製表的結構,但它不復制校驗和的函數值。
我寫了一個查詢來將表的結構從一個表複製到另一個sql server表中。在sql server中將整個表結構從一個表複製到另一個表
SELECT * INTO Database.Schema.TableNew
FROM Database.Schema.OldTable
WHERE 1=2
但通過該查詢,我能夠複製表的結構,但它不復制校驗和的函數值。
解決方法是右鍵單擊表格 - >腳本表爲 - >創建腳本 - >新查詢窗口。
您將所有約束/鍵作爲原始表。在新的數據庫中運行腳本。
當然,這是一個只有在處理少量表格時的解決方案,因爲如果您必須手動重複多個表格,它會變得笨拙。
但我想創建查詢,因爲我要爲多個表 – MakDeveloper
這可能有助於做到這一點, http://dba.stackexchange.com/questions/18059/copy-complete-structure-of-a-table – Chendur
我寫了一個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'
是否要限制拷貝到新表。如果是的話,那麼它是不可能的'INTO'條款 –
是的,我想,然後複製限制 – MakDeveloper
@ evil333是正確 –