1

我有两个更新声明。两者相似,但在不同的表集上运行。一个有效,另一个无效。我不确定为什么。

我有一个名为 UPLOAD 的表。它包含来自另一个数据系统的解析结果。

  • 供应商文本 (nVarChar(50))
  • 供应商 ID (BigInt)
  • 模型文本 (nVarChar(50)
  • 模型 ID (BigInt)
  • UnitText (nVarChar(50))
  • 单位 ID (BigInt)
  • 子单元文本 (nVarChar(50))
  • 子单元 ID (BigInt)

最初,四个文本字段是从解析中填充的。

我们从四个表中提取信息。

  • 供应商表
  • 模型表
  • 单元表
  • 子单元表

Model 表有一个整数字段,将其链接到 Vendor 表。

Subunit 表有一个将其链接到 Unit Table 的整数字段。

我们使用了四个标量函数。

  • FindVendor - 获取文本值并在供应商表中搜索名称并返回 PK。

  • FindModel - 采用文本值和整数值(
    供应商的 PK)。返回型号的 PK。

  • FindUnit - 获取文本值并在 UnitTable 中搜索匹配项并返回单位的 PK。
  • FindSubUnit - 获取文本值和整数值(UNIT 的 PK)并返回 SubUnit 的 PK。

更新有效的声明

UPDATE UPLOADTABLE
  SET
      VendorID = FindVendor(VendorText),
      ModelID = FindModel(ModelText, VendorID)

我已经对此进行了测试,它给出了正确的结果。

然而这失败了。

UPDATE UPLOADTABLE
  SET
      UNITID = FindUnit(UnitText),
      SubUnitID = FindSubUnit(SubUnitText, UnitID)

我得到的只是 SubUnitID 中的零。

然而,这确实有效。

UPDATE UPLOADTABLE
  SET
     UnitID = FindUnit(UnitText);

UPDATE UPLOADTABLE
  SET
     SubUnitID = FindSubUnit(SubUnitText, UnitID)

不知道为什么第一个有效而第二个失败。除非型号的更新只是偶然。我不知道 update 语句何时写入 Set 语句的 eadch 的结果。

有任何想法吗?

4

2 回答 2

4

假设没有定义触发器,并且更新都没有违反任何约束,那么两者之间的区别

UPDATE UPLOADTABLE SET
  UNITID = FindUnit(UnitText),
  SubUnitID = FindSubUnit(SubUnitText, UnitID)

UPDATE UPLOADTABLE SET
  UnitID = FindUnit(UnitText);
UPDATE UPLOADTABLE SET
 SubUnitID = FindSubUnit(SubUnitText, UnitID)

是在第一种情况下,UnitID传递给FindSubUnit的是旧值UnitID: 你还没有更新它。如果UPDATE不是那样工作,您将无法编写交换语句,如UPDATE table SET field1 = field2, field2 = field1. 您将能够执行该操作,但它不会执行您想要的操作。

在单个更新中编写它的一种可能方法是

UPDATE UPLOADTABLE SET
  UNITID = FindUnit(UnitText),
  SubUnitID = FindSubUnit(SubUnitText, FindUnit(UnitText))
于 2013-08-08T16:26:55.573 回答
1

这不是您问题的答案,我认为 hvd 已经解释了 update 语句的工作原理,所以我认为回答您问题的关键在于 UDF 的定义FindModel。但是,我想我会指出您可以通过在更新中简单地使用 JOIN 来一次执行所有这些更新而不会出现任何问题(并且更有效):

UPDATE  UPLOADTABLE
SET     VendorID = v.VendorID,
        ModelID = m.ModelID,
        UnitID = ut.UnitID,
        SubUnitID = s.SubUnitID
FROM    UPLOADTABLE u
        LEFT JOIN VendorTable v
            ON v.VendorText = u.VendorText
        LEFT JOIN ModelTable m
            ON m.VendorID = v.VendorID
            AND m.ModelText = u.ModelText
        LEFT JOIN UnitTable ut
            ON v.UnitText = ut.UnitText
        LEFT JOIN SubUnitTable s
            ON s.UnitID = v.UnitID
            AND s.SubUnitText = u.SubUnitText;
于 2013-08-08T16:41:21.393 回答