2016-02-27 50 views
1

我寫了一個查詢來將表的結構從一個表複製到另一個sql server表中。在sql server中將整個表結構從一個表複製到另一個表

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

但通過該查詢,我能夠複製表的結構,但它不復制校驗和的函數值。

+0

是否要限制拷貝到新表。如果是的話,那麼它是不可能的'INTO'條款 –

+0

是的,我想,然後複製限制 – MakDeveloper

+0

@ evil333是正確 –

回答

2

解決方法是右鍵單擊表格 - >腳本表爲 - >創建腳本 - >新查詢窗口

您將所有約束/鍵作爲原始表。在新的數據庫中運行腳本。

當然,這是一個只有在處理少量表格時的解決方案,因爲如果您必須手動重複多個表格,它會變得笨拙。

+0

但我想創建查詢,因爲我要爲多個表 – MakDeveloper

+1

這可能有助於做到這一點, http://dba.stackexchange.com/questions/18059/copy-complete-structure-of-a-table – Chendur

1

我寫了一個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' 
相關問題