Sql-Server

如何將 Sql Server DB 模式導出為 ALTER 語句?

  • October 16, 2020

我有一個 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 

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