簡體   English   中英

SQL:如何將所有表中的所有 varchar 列更改為 nvarchar?

[英]SQL: How to alter all varchar column in all tables to nvarchar?

我需要將大約 40 個表(填充數據)中的所有varchar列轉換為nvarchar列。 計划在僅用於此目的的專用 MS SQL 服務器中發生。 結果應移至 Azure SQL。

應該在哪里進行轉換:在舊的 SQL 上,還是在 Azure SQL 服務器上移動之后?

根據 Remus Rusanu 的回答https://stackoverflow.com/a/8157951/1346705 ,在此過程中創建了新的nvarchar列,並刪除了舊的varchar列。 可以通過DBCC CLEANTABLE或使用ALTER TABLE... REBUILD回收空間。 刪除的varchar列是否打包到備份表中,或者備份/恢復是否也刪除了刪除的列?

可以使用通用 SQL 腳本以某種方式自動化該過程嗎? 或者是否有必要為每個單獨的表編寫腳本?

背景:我們是企業信息系統第三者 我們的產品從信息系統 SQL 數據庫中讀取數據,並以在 IS 中實施成本高昂的方式呈現數據。 企業信息系統現已遷移到新版本,將在Azure SQL上運行。 IS 的數據庫進行了重大更改,其中一項更改是放棄舊的 8 位文本編碼 ( varchar ) 並改用 Unicode ( nvarchar )。 我們的系統還用於收集手動輸入的數據——使用與舊 IS 相同的編碼。

遷移將通過執行舊版本的備份(生成SqlCmd文件的xxx.bak )來完成,在另一個好的舊 SQL 服務器上恢復。 然后我們運行刪除所有可以從 IS 重建的表、視圖和存儲過程的腳本。 主要原因之一是 SQL 代碼使用了新備份工具SqlPackage.exe不接受的功能來生成xxx.bacpac文件。 然后在Azure SQL中恢復bacpac文件。

應該在哪里進行轉換:在舊的 SQL 上,還是在 Azure SQL 服務器上移動之后?

我會首先在本地 SQLServer 上執行此操作,在 Azure 數據庫上運行此操作,可能會導致您遇到一些問題,例如達到 DTU 限制、磁盤 IO 限制。

刪除的 varchar 列是否打包到備份表中,或者備份/恢復是否也刪除了刪除的列?

空間不會被釋放回文件系統,備份也不處理可用空間,所以你不會在那里看到太多變化。不過,在繼續之前,你可能想閱讀更多關於 dbcc cleantable 的內容。

可以使用通用 SQL 腳本以某種方式自動化該過程嗎? 或者是否有必要為每個單獨的表編寫腳本?

它可以自動化,也許您可以使用動態 sql 來查看列類型並進一步處理。您還必須查看這些列中是否有任何列是索引的一部分,如果是,則必須先刪除它們

我建議事先對舊實例進行架構更改。 即使您不費心使用DBCC CLEAANTABLEALTER...REBUILD清理空間,生成的 bacpac 大小也將相同,因為與物理備份/恢復不同,bacpac 文件只是模式和數據的壓縮 package 格式.

考慮使用 SQL 服務器數據工具 (SSDT) 來促進架構更改。 這將考慮對“通用”T-SQL 解決方案構成挑戰的所有依賴項(約束、索引等)。 SSDT 通常會生成一個遷移腳本,該腳本使用臨時表進行此類架構更改,因此最終結果不會浪費舊數據庫中的空間。 但是,您將需要數據庫中有足夠的未使用空間來並排包含舊/新對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM