0

CS2009 用に SQL Server 2008 の一部のデータをクリーンアップするタスクがあります。プロファイル データベースには、2 つのテーブルがあります。

  1. 住所
  2. ユーザーオブジェクト

    住所:

    address_id、line1、line2 GUID、varchar、varchar

    ユーザー オブジェクト:

    userid_id、addressguids、acitivtydate GUID、varchar、datetime

X よりも古い (つまり、アクティビティがなかった) すべての UserObjects を削除する必要があります。それは明らかに問題ではありません。私の問題は、その人に属するアドレスを削除したいときに発生します。これらは連結方式で 1 ​​つのフィールドに格納されます。たとえば、ユーザーが 2 つのアドレスを持っている場合、次のようになります。

2;{guid1};{guid2}

最初の数字は GUID の数で、すべてセミコロンで区切られています。Address テーブルには、user_id を関連付けるためのフィールドがありません (非常に面倒です)。Address テーブルの唯一の ID はアドレス GUID です。

私の質問は、これを SQL でどのように整理できるかということです (私の SQL は少し貧弱です)。私はそれが次のようなものになると想像します:

  • activitydate > X のすべてのユーザーを選択します
  • アドレス GUID 文字列を引き離し、各 GUID を取得する
  • アドレス テーブルの各 GUID を削除します
  • ユーザーを削除

アドレスを削除するには、部分文字列または何かを削除して、最初の番号とセミコロンを削除し、残りのセミコロンをコンマに置き換えて、それを when IN 句に入れると思います。

ループ、それを行う最良の方法などについての手がかりはありません。

ありがとう

4

2 に答える 2

2

私は段階的にそれを行うと思います:

まず、user_address 用の新しいテーブルを作成します。これには user_id と address_guid が必要です。次に、proc またはループを記述して、アドレス guid をこの新しい構造に分割します。

クエリを実行して、正しいことを確認してください。拭いていない場合は最初からやり直してください。

完了したら、これを使用して削除を行います。はるかに簡単にする必要があります。

于 2010-10-14T13:45:50.437 に答える
0

以前に回答したように、新しいテーブルを使用したくない場合 (ちなみに、その回答に問題はありません)、文字列操作を行い、すべての GUID を返すテーブル値関数を作成できます。ユーザー ID を含む新しい行の「addressguids」フィールド。

それが完了したら、この Technet 記事 で説明されているように、CROSS APPLY または OUTER APPLY を使用して、テーブルであるかのように関数を結合できます。

于 2010-10-14T13:57:35.437 に答える