Sql-Server
如何將 Sql Server DB 模式導出為 ALTER 語句?
我有一個 2 個月大的數據庫,我想為該數據庫獲取新架構,而不使用
ALTER
語句刪除其中的數據。是否可以?目前我正在一些臨時數據庫中備份舊數據庫的表數據,然後用新數據庫替換舊數據庫並從臨時數據庫中插入備份數據。遷移架構的最佳解決方案是什麼?
我會寫這樣的東西,首先在新數據庫上執行 - 以獲取遷移程式碼,然後在舊數據庫上執行生成的遷移程式碼 - 以更改架構。
這只是添加缺少的列而不完整的一部分。您還應該檢查 is_identity、約束、其他數據類型等。
也許網際網路上有完整的程式碼……
SELECT 'IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE object_id=OBJECT_ID('''+t.name+''') AND name='''+c.name+''') ALTER TABLE ' + QUOTENAME(t.name) + ' ADD ' + QUOTENAME(c.name) + ' ' + tt.name + CASE WHEN tt.name IN ('varchar','nvarchar') THEN '(' + CAST(c.max_length as varchar(10)) + ')' ELSE '' END + ' ' + CASE WHEN c.is_nullable = 1 THEN 'NULL' ELSE 'NOT NULL' END + char(13)+char(10)+char(13)+char(10) FROM sys.tables t JOIN sys.columns c ON c.object_id = t.object_id JOIN sys.types tt ON tt.user_type_id = c.user_type_id
結果 - 遷移程式碼:
IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE object_id=OBJECT_ID('users') AND name='id') ALTER TABLE [users] ADD [id] int NOT NULL IDENTITY IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE object_id=OBJECT_ID('users') AND name='login') ALTER TABLE [users] ADD [login] varchar(100) NOT NULL IF NOT EXISTS(SELECT 1 FROM sys.columns WHERE object_id=OBJECT_ID('users') AND name='email') ALTER TABLE [users] ADD [email] varchar(100) NULL