4

SQL Server データベースから情報を取得し、Web サービスを介してオブジェクト モデルをロードし、その情報を SQL Server とは異なるスキーマに基づく Access DB に渡すアプリケーションを作成しようとしています。データベースに含まれていますが、含まれている情報は同じです (したがって、これは ETL プロセスに似ていると思います)。私が実行している問題は、情報を取得しているデータベース (SQL Server) の主キーが GUID であるのに対し、それらを入れているデータベース (Access) は INT であることです。たとえば、次のようになります。

表 1、SQL Server の Persons テーブル:

╔══════════════════════════════════════╦══════════╦════════════╗
║                  ID                  ║   Name   ║ CreatedOn  ║
╠══════════════════════════════════════╬══════════╬════════════╣
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ Person 1 ║ 01/01/2012 ║
║ DE44577A-CAE7-4101-B962-C052214E723B ║ Person 2 ║ 02/01/2012 ║
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ Person 3 ║ 03/01/2012 ║
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ Person 4 ║ 04/01/2012 ║
╚══════════════════════════════════════╩══════════╩════════════╝

表 2、Access の Persons テーブル:

╔════╦══════════╦════════════╗
║ ID ║   Name   ║ CreatedOn  ║
╠════╬══════════╬════════════╣
║  1 ║ Person 1 ║ 01/01/2012 ║
║  2 ║ Person 2 ║ 02/01/2012 ║
║  3 ║ Person 3 ║ 03/01/2012 ║
║  4 ║ Person 4 ║ 04/01/2012 ║
╚════╩══════════╩════════════╝

したがって、表 1 は SQL Server データベースでデータがどのように返されるかを示し、表 2 は Access データベースで情報がどのように表示されるかを示しています。したがって、すべての GUID は整数である必要がありますが、データ間の関係は同じままにする必要があります。たとえば、SQL Server と Access で人の住所を取得するクエリを実行すると (住所テーブルも同様に設定されます)、GUID や整数が使用されているかどうかに関係なく、クエリは同じ結果を返すはずです。

私が考えていたのは、SQL Server で ROW_NUMBER() を使用し、CreatedOn 日付 (データベースの日時型であり、すべてのレコードで一意である必要があります) で並べ替えることでした:

SELECT 
  (ROW_NUMBER() OVER (ORDER BY CreatedOn)) AS ID,
  Name,
  CreatedOn
FROM Table2;

唯一のことは、重複した整数 ID がクエリから返されていることです。たとえば、上記の表 1 は次のようになります。

╔════╦══════════╦════════════╗
║ ID ║   Name   ║ CreatedOn  ║
╠════╬══════════╬════════════╣
║  1 ║ Person 1 ║ 01/01/2012 ║
║  2 ║ Person 2 ║ 02/01/2012 ║
║  1 ║ Person 3 ║ 03/01/2012 ║
║  1 ║ Person 4 ║ 04/01/2012 ║
╚════╩══════════╩════════════╝

各 ID を一意にする必要がある場合。私が達成しようとしていることを実行するための良い方法を考えられる人はいますか? 私が現在やろうとしている方法に問題はありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

ROW_NUMBER()順序が常に同じかどうかはおそらくわからないので、私があなただったとしても、私は信頼しません。

まず、あなたの例では、列の日付値のみを (時間なしで) 表示しCreatedOnます。同じ日に複数の人が作成された場合、その日までに注文するとどちらが先かわかりません。
実際にCreatedOn列に時間がある場合でも、人がテーブルから削除されると、ROW_NUMBER後続のすべての人の時間は変更されます。


最も簡単な解決策は、webturnerの回答で既に提案されているように、テーブルの 1 つを変更することです。
なんらかの理由でこれを行うことができない場合 (たとえば、どちらのデータベースのスキーマもまったく変更できない場合、またはテーブルのスキーマを変更すると従来のものが壊れる場合)、マッピングを作成できます。 2 つのテーブル間の関係を格納するテーブル:

╔══════════════════════════════════════╦══════════╗
║             SqlServerID              ║ AccessID ║
╠══════════════════════════════════════╬══════════╣
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║    1     ║
║ DE44577A-CAE7-4101-B962-C052214E723B ║    2     ║
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║    3     ║
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║    4     ║
╚══════════════════════════════════════╩══════════╝

既存のデータベースを変更することが許可されていない場合は、3 番目のデータベースに入れることもできます。

于 2012-05-17T14:43:29.320 に答える
0

最も簡単な解決策は、どちらか一方のスキーマを同じになるように変更することです。アクセス側と SQL 側の両方にレコードを追加する場合は、GUID を使用して、2 つの異なるレコードに同じ ID が追加されるのを防ぎます。あとは、独自の「複製」システムを展開するだけです。Access と SQL の両方が GUID をサポートしています。

各テーブルに対して何らかのルックアップが必要になることに失敗します。これにより、各 GUID に相当する整数が得られ、その逆も同様です。GUID を Access テーブル (表 2) の追加の列として追加すると、これをルックアップ テーブルとして使用できます。

ROW_NUMBER() は一意の番号を返しますが、使用するたびに 1 から始まるため、各テーブルのすべての挿入を 1 つのセットで行う必要があります。アクセスで Autonumber フィールドを使用すると、個別の挿入で一意の値が得られます。

Access テーブルに SQL の GUID と一意の ID があるとすれば、アドレス テーブルなどの外部キーを持つテーブルに挿入するたびにルックアップを実行するだけで済みます。そのため、GUID を使用して SQL からアドレスを挿入して人物を識別する場合、GUID のアクセスの Person テーブルに参加し、代わりに人物の整数 ID を挿入します。

于 2012-05-17T10:22:57.823 に答える