【发布时间】:2010-07-09 21:16:36
【问题描述】:
所以我有这个需要更新的 SQL 表。现在我们使用一个工具来完成这个过程,所以如果我们只是重命名列,那么它将不起作用,因为我们的工具只会删除旧列并添加一个具有新名称的新列,所以我们必须手动完成并输入将此代码添加到构建中并从我们的构建中排除该表。
我们目前拥有的表有一个名为“FeeTypeId”的列。我们有另一个表,一个查找表,它有一堆与类型和描述相关的 ID。我们希望我刚才提到的另一个表上的先前“FeeTypeId”字段包含这些与特定“FeeDescription”相关的 LookupId。我将有一个包含映射的 Excel 表,所以目前没有真实数据,只有逻辑。
这是我写的脚本,但我不知道它是否会运行。你们能帮帮我吗?
----------------------------------------------------------------------
--PRE_UPGRADE--
----------------------------------------------------------------------
CREATE TABLE dbo.TmpFeesToRules(OldValue varchar, NewValue varchar)
--populate with values from Excel
----------------------------------------------------------------------
--POST UPGRADE--
----------------------------------------------------------------------
UPDATE Lending.ApplicationFee
SET FeeTypeId =
CASE t.NewValue
WHEN <> null THEN (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupDesc = t.NewValue)
ELSE (SELECT LookupID FROM tblLookup WHERE LookupType = 'FEE_CODE' AND LookupCode = 'OTHER') END
-- else might change, might not even need an else
FROM TmpFeesToRules t INNER JOIN tblLookup l ON t.NewValue = l.LookupDesc
-- Drop the tmp table
DROP TABLE dbo.TmpFeesToRules
【问题讨论】:
-
在存储过程中执行此操作是否可以接受,因此您可以首先创建一个分配值的变量(使用该 case 语句),然后在更新中使用它?这将大大提高代码的可读性。
-
我希望。由于我们构建的方式,这几乎是唯一可以完成的方法。他们不希望将任何内容添加到实际数据库中。否则,我可能只是用所有新数据创建另一个表,然后构建删除旧数据就没有问题了。然后我就把它复制过来。
标签: sql sql-server