2017-03-16 112 views
0

是否有辦法完全遍歷數據庫中的所有表並將所有varchar數據類型更改爲nvarchar數據類型?將varchar更改爲數據庫中所有表列的nvarchar

由於受索引,唯一鍵以及不可用的限制,下面的簡單SQL無法按預期工作。

ALTER TABLE [CUS].[Customers] 
    ALTER COLUMN [CustomerNo] NVARCHAR(500); 

我試圖通過GUI方式從SSMS更改它們,並且事件探查器實際上顯示了它如何真正更改數據類型。

  • 步驟1:它創建的臨時表,與nvarchar柱從varchar改變
  • 步驟2:設置一些鎖升級(不知道這是什麼)
  • 步驟3:從原始表中插入所有數據到臨時表
  • 步驟4:滴原表
  • 步驟5:重命名臨時表原始表的名稱
  • 步驟6:添加約束
  • 第7步:添加索引

這涉及很多步驟,這是相當繁瑣的,如果我是做手工。

任何人都可以提出一個更靈活的解決方案來解決我的問題嗎?

+0

我不認爲有一個更安全的方法來做到這一點。您可以更新syscolumns表中的varchar數據類型,但這可能會導致不一致。我建議你遵循7個步驟。 – MayowaO

+1

你絕對應該使用nvarchar,但只在適當的地方。這些是一些關於你可能不希望改變類型的例子:'CustomerNo'(就像上面的例子,如果它只不過是字符0-9),或者配置持久化爲json或密碼哈希,等等。關鍵是它會吸引一個大型數據庫,但是通過架構和枚舉不應該轉換的列可能是謹慎的。 – Igor

+0

該應用程序擴展到英語以外,varchar在我們有中國/泰國客戶時一直運行良好。 – IvanJazz

回答

1

另外,您可以:

  1. script whole database without data
  2. 從VARCHAR
  3. 阿爾特列定義爲nvarchar
  4. 二者必選其一SSIS或SQL來傳輸數據

優點:

  • 它將對源數據庫
  • 潛在的影響較小,你可以儘量減少負面影響,甚至更多,你可以單獨的服務器

缺點上運行此:

  • 你就必須全部轉讓數據,這需要時間
  • 你將不得不確保你有足夠的磁盤空間在服務器上的數據庫數據,索引數據和日誌文件

根據傳輸方法的不同,您可能會選擇不同的傳輸方式和大小,即使您處於簡單恢復模式,日誌文件也可能會變大。當您在一筆鉅額交易中轉移大量數據時,這是最糟糕的情況。

作爲一方評論:我同意@Igor - 如果您絕對必須不要更改數據類型。

+0

我會失去我的索引這種方式是正確的? – IvanJazz

+0

如果您編寫腳本數據庫,則不會丟失任何索引,除非您在生成數據庫腳本時選擇這樣做。 –

相關問題