我需要将表中的主键列从int类型更改为guid类型。数据库已经有数据,我不想丢失数据,并且还需要考虑到外键。有没有无痛的方法可以做到这一点,或者我必须通过一个大脚本手动完成呢?:) 我会感激任何建议。
我需要将表中的主键列从int类型更改为guid类型。数据库已经有数据,我不想丢失数据,并且还需要考虑到外键。有没有无痛的方法可以做到这一点,或者我必须通过一个大脚本手动完成呢?:) 我会感激任何建议。
你需要通过脚本来完成,以下是具体步骤:
0) 进入单用户模式
1) 在主表中添加新的GUID列,并填充数据。
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) 在guid列上添加新的FKs
6) 退出单用户模式
您应该能够让SQL Server Management Studio生成用于添加和删除列和键的脚本。只需在SSMS中进行更改,然后单击“生成更改脚本”工具栏图标,即可将代码复制并粘贴到文本文件中。
Create one helper function and procedure as follows:
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)
Now comes the manual work for every table: