2011-12-08 2 views
3

データの一部(主にレガシー)がSQL Serverに格納され、別の部分がMongodbに格納されるハイブリッドアプリケーションがあります。 SQL Serverに新しいレコードを挿入するときに、アプリケーションで生成するObjectIdを使用するようにSQL Serverのすべての主キーの型を変換しました。 今、私はいくつかのテンプレートレコード(一度に約10-20レコード)をクローンする必要があることを知り、それを行うために、SQL Server関数またはストアドプロシージャを介してObjectId値を生成できる必要があります。 可能ですか、利用可能なコードはありますか?SQL Server procとしてのMongodb ObjectIdジェネレータ

+0

プライマリキーは、SQL Serverの型ではありません(制約事項です)。私の知る限り、他のリレーショナルデータベースのいずれかです。 SQL ServerとMongoDBのテーブルのスクリプトを私たちに教えてください。また、「テンプレートレコードをいくつか複製する」ということをもっと詳しく説明してください。 –

+0

私は主キーが型ではなく制約であることを知っています。私は、テーブルのすべての主キー(元々はGUID)をObjectID(char(24))に置き換えました。私が尋ねるのは、SQLサーバー関数またはストアドプロシージャに新しいObjectID値を生成する方法があるのですか? – Andrey

答えて

1

NEWID 16バイトuniqueidentifierを生成する機能を使用すると思います。

ただし、MongoDBの場合BSON ObjectId Datatypeは12バイトのバイナリ値です。

この

SELECT LEFT(REPLACE(CAST(NEWID() as varchar(36)),'-',''),24) 

希望をお試しください、このことができます。記事Object IDs

編集

はBSONオブジェクトID仕様を記載しました。形式には、

  1. タイムスタンプが含まれます。これはUNIXスタイルのタイムスタンプです。 1970年1月1日の (UTC)の前後の秒数を表す符号付き整数です。
  2. マシン。これは、マシンホスト名、またはmac/networkアドレス、または仮想マシンの マシンIDの(md5)ハッシュの最初の3バイトです。
  3. pid。これは、オブジェクトIDを生成するプロセスのプロセスID(またはスレッドID)の2バイトです。
  4. 増分。これは増分する値であり、カウンタが言語/ランタイムで使用できない場合は乱数です。

サーバー自体とほぼすべてのドライバは、上記の形式を使用します。

したがって、 SQL ServerでMongoDB ObjectIDを生成することはできません。

この問題を解決する唯一の方法は、アプリケーションのロジックを変更することです。

+0

単純なバイナリ値ではなく、強力な構造を持っています - > http://www.mongodb.org/display/DOCS/オブジェクト+ ID#ObjectIDs-BSONObjectIDSpecification –

+0

それはユニークではありません... – Andrey

+0

@Andrey申し訳ありません。あなたは「それはユニークではないでしょうか?もちろん、2の出現確率は32桁の数字よりも大きい24桁の数字ですが、同じ年にロシアの会長と米国のあなたになる可能性はまだ低いです。 –

0

この質問は古いですが、私は同じことをやろうとしていました。これは、私は、SQL Server 2012

Create Function NewObjectId(@counter binary(3)) 
returns binary(12) 
begin 

    declare @epoch datetime2, @seconds binary(4), @process binary(2), @hostname binary(3) 
    set @epoch = '1/1/1970' 

    select @seconds = cast(Datediff(ss, @epoch, getutcdate()) as binary(4)) 
    select @hostname = cast(HashBytes('MD5', HOST_NAME()) as binary(3)) 
    select @process = cast(@@SPID as binary(2)) 

    declare @objectId binary(12) 
    select @objectId = (@seconds + @hostname + @process + @counter) 

    return @objectId 
end 

に思い付いたこれは次のように呼び出すことができますされています。その関数を呼び出すことは明らか側であるため、CRYPT_GEN_RANDOM(3)に渡され

select NewObjectId(CRYPT_GEN_RANDOM(3)) 

理由があります他の関数の中で使用することはできません。私はカウンター部分のインクリメントシーケンスを使用することを好みましたが、乱数も同様に機能します。

また、値を保存するためにchar(24)を使用していると言われました。 MongoDB ObjectIdはバイナリ(12)を返します。バイナリ(12)を使用すると、値を格納するために領域の半分が必要になります。

これは今役に立ちませんが、解決するのは楽しい問題でした。

ObjectID C#コードを取得して、SQL ServerにCLR関数としてロードできるかどうかを確認します。それはより良い結果とパフォーマンスをもたらします。

関連する問題