1

更新ステートメントが 2 つあります。どちらも似ていますが、異なるテーブル セットで動作します。1つは機能しますが、もう1つは機能しません。理由はわかりません。

UPLOAD というテーブルがあります。これには、別のデータ システムからの解析結果が含まれます。

  • VendorText (nVarChar(50))
  • ベンダーID (BigInt)
  • ModelText (nVarChar(50)
  • モデル ID (BigInt)
  • UnitText (nVarChar(50))
  • ユニット ID (BigInt)
  • SubUnitText (nVarChar(50))
  • SubUnitID (BigInt)

最初に、4 つのテキスト フィールドが解析から入力されます。

情報を引き出すテーブルは 4 つあります。

  • ベンダーテーブル
  • モデル テーブル
  • 単位表
  • サブユニット テーブル

モデル テーブルには、ベンダー テーブルにリンクする整数フィールドがあります。

サブユニット テーブルには、それをユニット テーブルにリンクする整数フィールドがあります。

使用するスカラー関数は 4 つあります。

  • FindVendor - テキスト値を取得し、Vendor テーブルで名前を検索して、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)

最初のものは機能し、2番目のものは失敗する理由がわかりません。モデル番号の更新が偶然に機能している場合を除きます。update ステートメントが Set ステートメントの結果をいつ書き込むかはわかりません。

何か案は?

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。あなたはそれを実行することができますが、それはあなたが望むことをしません.

1 回の更新でそれを書き込む 1 つの可能な方法は、

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 に答える