我需要将表中的主键列的类型从int更改为guid。数据库已经有我不想丢失的数据,并且有外键可以考虑。有没有一种无痛的方式来做到这一点,或者我必须通过一个大的**脚本手动做到这一点?:)我会很感激任何建议sql服务器将PK类型从int更改为uniqueidentifier
5
A
回答
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
- 在数据库中使用选项“生成脚本”以创建“DROP/CREATE CONSTRAINT和INDEXES”(使用高级按钮来调整向导)。 运行创建的SQL脚本的一部分来删除索引和约束。
创建一个辅助函数和过程如下:
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)
现在到了人工作业的每个表:
-
在设计师
- 打开表(SQL Management Studio或其他工具)
- 将bigint类型的列更改为VARCHAR(50)
- 执行“EXEC bigIntToGuid'myTable','myBigIntColumn'
- 回表设计更改列类型为“唯一标识符”
- 您也可以选择添加默认值:NEWID(),和/或设置列作为主键
- 打开SQL生成的脚本在步骤1中创建
- 选择脚本的约束和索引创建的唯一部分,并执行它
这种方法可以确保转换的int GUID,并保持数据的完整性。
+0
SQL代码段中存在拼写错误:HashToGuid应该读取GuidFromHash,或者函数名称应该更改为HashToGuid。 – 2017-05-30 19:12:43
相关问题
- 1. SQL Server将字段类型从数字更改为int
- 2. SQL服务器:转换从字符串转换为uniqueidentifier
- 3. 误差变换数据bigint类型为int [SQL服务器]
- 4. 在数据库项目中将Int更改为uniqueidentifier
- 5. postgreSQL同时将列类型从int更改为bigint
- 6. 将主键类型从int更改为bigint
- 7. 如何在Sql Server中将序列类型从int更改为bigint
- 8. Infopath - 更改sql服务器
- 9. 在SQL服务器中更改域子类型
- 10. SQL服务器 - 结果空间不足uniqueidentifier值转换为char
- 11. Nodejs将服务器HTTP更改为HTTPS
- 12. 在SQL Server类型为int的更改列中键入文本
- 13. 将SQL Server RDS实例类型从Web更改为标准版
- 14. 连接的数据库服务器不支持从'uniqueidentifier'到'int'的转换
- 15. 在远程机器中将服务启动类型更改为Delayed(自动)
- 16. mysql:如何将列更改为PK Auto_Increment
- 17. SQL Server 2005 UniqueIdentifier和C#数据类型
- 18. 无法将字符串的类型更改为int?
- 19. 使用组聚合时,数据类型从Int更改为Float
- 20. savetxt如何从float64类型更改为int或双
- 21. 将varchar转换为int SQl服务器2005
- 22. 将int值转换为sql服务器中的datetime
- 23. jax-ws将内容类型更改为内容类型,因为服务器超敏感
- 24. 将列主键和外键VARCHAR数据类型更改为INT数据类型
- 25. 将服务器从NGINX更改为Apache中的MAMP
- 26. 将所有SQL Server列从BigInt更改为Int
- 27. 将数字从varchar改为int的列的类型
- 28. 将ConsoleKeyInfo更改为int
- 29. Java - 将int更改为ascii
- 30. 将TextView更改为Int值
你为什么要这样做?我目前正在尝试相反的... – cjk 2010-03-29 14:11:27
我也是,宁愿建议**不要**这样做 - 任何特殊原因? – 2010-03-29 14:58:38
我需要这样做,因为我设置了多个订阅服务器的合并复制,并且我不希望我的行ID由于同步而发生更改。另外,因为合并复制会自动在所有表中添加一个guid列,如果你不准备有一个guid PK col,则一个aditional int id colun是多余的。 – anakic 2010-03-30 06:40:44