2010-03-29 61 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

相关问题