2010-03-29 48 views
5

我需要將表中的主鍵列的類型從int更改爲guid。數據庫已經有我不想丟失的數據,並且有外鍵可以考慮。有沒有一種無痛的方式來做到這一點,或者我必須通過一個大的**腳本手動做到這一點?:)我會很感激任何建議sql服務器將PK類型從int更改爲uniqueidentifier

+2

你爲什麼要這樣做?我目前正在嘗試相反的... – cjk 2010-03-29 14:11:27

+0

我也是,寧願建議**不要**這樣做 - 任何特殊原因? – 2010-03-29 14:58:38

+0

我需要這樣做,因爲我設置了多個訂閱服務器的合併複製,並且我不希望我的行ID由於同步而發生更改。另外,因爲合併複製會自動在所有表中添加一個guid列,如果你不準備有一個guid PK col,則一個aditional int id colun是多餘的。 – anakic 2010-03-30 06:40:44

回答

5

你將不得不用艱難的方式,使用腳本:

在單用戶模式
1)新的GUID列添加到主表

0)獲得,並且填充它。
2)新的FK列添加到每個子表並填充它們與一個UPDATE FROM

UPDATE c 
    SET FKcolumn=p.NewGuid 
    FROM ChildTable    c 
     INNER JOIN ParentTable p ON p.OldIntID=c.OldIntId 

3)刪除現有的INT FKS
4)刪除舊INT列
5)添加新的指南列上的FK
6)退出單用戶模式

您應該能夠讓SQL Server Management Studio生成用於添加和刪除列和鍵的腳本。只需在SSMS中進行更改,然後單擊「生成更改腳本」工具欄圖標,即可將代碼剪切並粘貼到文本文件中。

0
  1. 在數據庫中使用選項「生成腳本」以創建「DROP/CREATE CONSTRAINT和INDEXES」(使用高級按鈕來調整嚮導)。 運行創建的SQL腳本的一部分來刪除索引和約束。
  2. 創建一個輔助函數和過程如下:

    CREATE FUNCTION [dbo].[GuidFromHash] 
    (
        @Input nvarchar(MAX) 
    ) 
    RETURNS nvarchar(MAX) 
    AS 
    BEGIN 
        RETURN LOWER(SUBSTRING(@Input, 1,8)+'-'+SUBSTRING(@Input, 9,4)+'-'+SUBSTRING(@Input, 13,4)+'-'+SUBSTRING(@Input, 17,4)+'-'+SUBSTRING(@Input, 21,12)) 
    END 
    
    CREATE PROCEDURE [dbo].[bigIntToGuid] 
    (
        @table varchar(50), 
        @column varchar(50) 
    ) 
    AS 
    DECLARE @SQL VARCHAR(MAX) 
    
    SET @SQL='UPDATE @Table SET @Column=dbo.HashToGuid(''cc''+CONVERT(VARCHAR, HASHBYTES(''MD5'',LTRIM(@Column)),2))' 
    SET @SQL=REPLACE(@SQL,'@Table',@Table) 
    SET @SQL=REPLACE(@SQL,'@Column',@Column) 
    EXEC(@SQL) 
    
    SET @SQL='SELECT * FROM @Table' 
    SET @SQL=REPLACE(@SQL,'@Table',@Table) 
    SET @SQL=REPLACE(@SQL,'@Column',@Column) 
    EXEC(@SQL) 
    
  3. 現在到了人工作業的每個表:

      在設計師
    1. 打開表(SQL Management Studio或其他工具)
    2. 將bigint類型的列更改爲VARCHAR(50)
    3. 執行「EXEC bigIntToGuid'myTable','myBigIntColumn'
    4. 回表設計更改列類型爲「唯一標識符」
    5. 您也可以選擇添加默認值:NEWID(),和/或設置列作爲主鍵
  4. 打開SQL生成的腳本在步驟1中創建
  5. 選擇腳本的約束和索引創建的唯一部分,並執行它

這種方法可以確保轉換的int GUID,並保持數據的完整性。

+0

SQL代碼段中存在拼寫錯誤:HashToGuid應該讀取GuidFromHash,或者函數名稱應該更改爲HashToGuid。 – 2017-05-30 19:12:43

相關問題