首页 > 解决方案 > 在不影响代码的情况下转换表格设计

问题描述

背景

我们有一个非常古老的数据库设计。最糟糕的例子是配置表。它是一行,每个值都有一个单独的列。它应该是键值对设置(显然)。它在我们的旧遗留代码和现在的基于 Web 的新代码中无处不在。可怕的是,现在有超过 300 列,更糟糕的是不时地添加更多。

目标

我很想把桌子扔进垃圾箱,然后用正确的键值对替换它。但是编码时间很短,所以我试图想出一种聪明的方法,将它显示为旧的旧代码行,以便从键值对中检索它。

尝试的解决方案

通常我会使用一个视图 - 但鉴于显示它的最佳代码(从这里捏:https ://stackoverflow.com/a/15745076/12059261 )是动态 SQL,我已经陷入困境,因为我不能使用动态视图中的 SQL(我的搜索告诉我视图不允许动态 SQL - 我假设这是正确的?)

表格示例

当前配置

键名地址等
1 我的公司 我的地址等

通缉配置

ID键值
1 名称我的公司
2 地址 我的地址
3等等等等

我想将表格从当前表格更改为新表格,但仍然能够将其作为当前表格显示为旧代码。

标签: sqlsql-serverviewdynamic-sql

解决方案


如果问题是向旧代码显示配置,则使用条件聚合:

create view oldconfig as
    select max(case when key = 'Name' then value end) as name,
           max(case when key = 'Address' then value end) as address,
           . . .
    from newconfig;

不用担心动态 SQL。遗留代码中使用了一组固定的列,这就是视图中需要包含的内容。如果添加新键,它们将不会出现在视图中,但可能无论如何旧代码都不会使用新键。


推荐阅读