Sql-Server

複製表的完整結構

  • September 19, 2019

使用某些方法,當您創建表的副本時,您會失去索引、PK、FK 等。例如在 SQL Server 中,我可以說:

select * into dbo.table2 from dbo.table1;

這只是表格的簡單副本;缺少所有索引/約束。如何復製表結構(不使用備份)?

我主要希望手動執行此操作,但如果不可能,我會接受任何解決方案。

當然,您可以使用 UI 相對簡單地編寫表格腳本:

在此處輸入圖像描述

這將輸出一個CREATE TABLE腳本,您只需搜尋並用新名稱替換舊名稱(並驗證具有新名稱的對像不存在)。

但是,如果您嘗試自動執行此操作(例如,在程式碼中生成創建表腳本),它會更麻煩一些。上面的腳本選項不只是CREATE TABLE從元數據中的單個位置提取整個 DDL;它在程式碼的幕後做了一大堆魔法來生成最終的CREATE TABLE腳本(你可以使用 Profiler 來查看它從哪裡獲取數據,但你看不到它是如何組裝它的)。我為此建議了一個選項:

http://connect.microsoft.com/SQLServer/feedback/details/273934

然而,這得到了很少的選票,並很快被微軟否決。您可能會發現使用 3rd 方工具來生成模式更值得(我已經在部落格上寫過這個)。

在 SQL Server 2012 中,有新的元數據函式可以讓您比 2005、2008 和 2008 R2 中的工作更接近,將元數據中的列資訊拼湊在一起(這有很多警告,例如,如果它是十進制你必須添加精度/比例,如果

$$ n[var[char $$] 你必須添加長度規範,如果 n$$ var $$char 您必須將 max_length 減半,如果它是 MAX,則必須將 -1 更改為 MAX 等)。在 SQL Server 2012 中,這部分要簡單一些:

SELECT name, system_type_name, is_nullable FROM
 sys.dm_exec_describe_first_result_set('select * from sys.objects', NULL, 0)

結果:

name                   system_type_name  is_nullable
--------------------   ----------------  -----------
name                   nvarchar(128)     0
object_id              int               0
principal_id           int               1
schema_id              int               0
parent_object_id       int               0
type                   char(2)           0
type_desc              nvarchar(60)      1
create_date            datetime          0
modify_date            datetime          0
is_ms_shipped          bit               0
is_published           bit               0
is_schema_published    bit               0

我也寫過關於這個的部落格。

CREATE TABLE可以說,這比使用 的複雜方法更接近您的目標陳述sys.columns,但仍有很多工作要做。鍵、約束、行選項中的文本、文件組資訊、壓縮設置、索引等。這是一個很長的列表,我將再次建議您為此使用 3rd 方工具,而不是冒著重複一遍的風險- 使用類比,重新發明輪子。

綜上所述,如果您需要通過程式碼執行此操作,但您可以在 SQL Server 之外執行此操作,則可以考慮 SMO/PowerShell。請參閱此技巧Scripter.Script() 方法

引用自:https://dba.stackexchange.com/questions/18059