![](/img/trans.png)
[英]How to convert varchar containing list of uniqueidentifiers into a list of uniqueidentifiers in SQL Server
[英]SQL Refactoring - Unique Names to UniqueIdentifiers
我正在重构数据库以支持对基于Web的工具的升级。
想象一下,我有四个表:里程碑,类别,技能和PayRates。 在旧模式下,这些表中的每一个仅列出一个名称,而该名称是该表的键。
在新模式下,每个表不仅具有名称,而且还具有用作表键的生成的uniqueidentifier。
现在,还可以想象我有一个表Tasks,其中每个Task由名称,里程碑,类别,技能和PayRate组成,并且每个都是从各自的表中选择的。 在旧模式下,该表仅存储名称。 在新模式下,此表将存储四个表的ID而不是名称,如下所示:
TaskID TaskName MilestoneID CategoryID SkillID RateID
其中TaskID是该任务生成的唯一标识符。
这些表中的每一个当前都包含需要从旧模式转移到新模式的数据。 我可以假定任务的四个组件中每个组件的名称以及任务本身的名称在旧模式中都是唯一的。
我的问题是,将数据从旧模式移到新模式的最简单查询是什么?
这样做是为了支持在同一数据库中存储里程碑,任务等两个单独的列表。
我会做以下
步骤零:备份数据库
第一步:将唯一标识符添加到里程碑,类别,技能和PayRates。 这是一个简单的列添加,默认值为下一个id。 这将为您的现有名称生成标识符。
第二步:将四个新列添加到现有任务表中(如果需要,将外键添加到源表中),而不删除旧的名称指向列。
第三步:运行(假设旧的名称指向列称为Milestone,Skill等)
update Tasks set MilestoneID = ( select MilestoneID from Milestones where Milestone = Tasks.Milestone ), CategoryID = ( select CategoryID from Categories where Category = Tasks.Category ), SkillID = ( select SkillID from Skills where Skill = Tasks.Skill ), PayRateID = ( select PayRateID from PayRates where PayRate = Tasks.PayRate )
第四步:检查一切是否就绪
第五步:从“任务”表中删除旧列,使新字段为非空
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.