複製表的完整結構
使用某些方法,當您創建表的副本時,您會失去索引、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() 方法。