データの一部(主にレガシー)がSQL Serverに格納され、別の部分がMongodbに格納されるハイブリッドアプリケーションがあります。 SQL Serverに新しいレコードを挿入するときに、アプリケーションで生成するObjectIdを使用するようにSQL Serverのすべての主キーの型を変換しました。 今、私はいくつかのテンプレートレコード(一度に約10-20レコード)をクローンする必要があることを知り、それを行うために、SQL Server関数またはストアドプロシージャを介してObjectId値を生成できる必要があります。 可能ですか、利用可能なコードはありますか?SQL Server procとしてのMongodb ObjectIdジェネレータ
答えて
NEWID 16バイトuniqueidentifierを生成する機能を使用すると思います。
ただし、MongoDBの場合BSON ObjectId Datatypeは12バイトのバイナリ値です。
この
SELECT LEFT(REPLACE(CAST(NEWID() as varchar(36)),'-',''),24)
希望をお試しください、このことができます。記事Object IDsで
編集
はBSONオブジェクトID仕様を記載しました。形式には、
- タイムスタンプが含まれます。これはUNIXスタイルのタイムスタンプです。 1970年1月1日の (UTC)の前後の秒数を表す符号付き整数です。
- マシン。これは、マシンホスト名、またはmac/networkアドレス、または仮想マシンの マシンIDの(md5)ハッシュの最初の3バイトです。
- pid。これは、オブジェクトIDを生成するプロセスのプロセスID(またはスレッドID)の2バイトです。
- 増分。これは増分する値であり、カウンタが言語/ランタイムで使用できない場合は乱数です。
サーバー自体とほぼすべてのドライバは、上記の形式を使用します。
したがって、 SQL ServerでMongoDB ObjectIDを生成することはできません。
この問題を解決する唯一の方法は、アプリケーションのロジックを変更することです。
単純なバイナリ値ではなく、強力な構造を持っています - > http://www.mongodb.org/display/DOCS/オブジェクト+ ID#ObjectIDs-BSONObjectIDSpecification –
それはユニークではありません... – Andrey
@Andrey申し訳ありません。あなたは「それはユニークではないでしょうか?もちろん、2の出現確率は32桁の数字よりも大きい24桁の数字ですが、同じ年にロシアの会長と米国のあなたになる可能性はまだ低いです。 –
この質問は古いですが、私は同じことをやろうとしていました。これは、私は、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関数としてロードできるかどうかを確認します。それはより良い結果とパフォーマンスをもたらします。
- 1. Meteor.Collection.ObjectID()とMongoDB ObjectId()
- 2. mongodb-wrapperとエントリのObjectId
- 3. SQL Serverの:EXECコマンドPROC
- 4. SQL ServerとMongoDBの比較?
- 5. Pong HTMLレンダリングとMongoDB ObjectID
- 6. MongoDB $ push ObjectId
- 7. MongoDBのデフォルトのObjectId
- 8. SQL ServerとMongoDB:速度テスト?
- 9. ノード+ Mongodb + ObjectIdが動作しない
- 10. ObjectId()をMongoDBのプロパティとして追加します
- 11. のMongoDBとMorphia - 代わりのObjectId
- 12. 接続-MongoDB&SQL Server
- 13. MongoDB ObjectIdのJSON問題
- 14. mongo ObjectIDをSQL Serverに格納する方法は?
- 15. ObjectIdでMongoDB Node.js deleteOneがObjectIdで動作しない
- 16. 'ObjectId'を使用したMongoDBの照会
- 17. ObjectIDでMongoDBコレクションを取得
- 18. mongodb $ ninでObjectIdが動作しない
- 19. Proc sqlの小計とサブクエリ
- 20. Webアプリケーション2.0のURLパラメータとしてmongodb ObjectIdを設定してください。
- 21. マングース - キーとしてのObjectID?
- 22. MongoDBはSQL Serverより遅い
- 23. は、特定のMongoDBのObjectIDのNode.jsの
- 24. redisとmongodbを使用したObjectIdの比較
- 25. MongoDB ObjectIdを短くしてMongooseスキーマで使用する方法
- 26. update mongoDBを使用してobjectIdの配列から削除
- 27. objectIDを使用してmongodbレコードを更新します。
- 28. MongoDBに挿入してObjectIDを保存しますか?
- 29. mongodbデータがIDの形で再生されています:ObjectId
- 30. セッションIDの安全なMongoDB ObjectID
プライマリキーは、SQL Serverの型ではありません(制約事項です)。私の知る限り、他のリレーショナルデータベースのいずれかです。 SQL ServerとMongoDBのテーブルのスクリプトを私たちに教えてください。また、「テンプレートレコードをいくつか複製する」ということをもっと詳しく説明してください。 –
私は主キーが型ではなく制約であることを知っています。私は、テーブルのすべての主キー(元々はGUID)をObjectID(char(24))に置き換えました。私が尋ねるのは、SQLサーバー関数またはストアドプロシージャに新しいObjectID値を生成する方法があるのですか? – Andrey