データの一部(主にレガシー)が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とMongoDBの比較?
- 4. SQL ServerとMongoDB:速度テスト?
- 5. ObjectId()をMongoDBのプロパティとして追加します
- 6. のMongoDBとMorphia - 代わりのObjectId
- 7. 'ObjectId'を使用したMongoDBの照会
- 8. ObjectIDでMongoDBコレクションを取得
- 9. mongodb $ ninでObjectIdが動作しない
- 10. redisとmongodbを使用したObjectIdの比較
- 11. ObjectIdの配列を格納するMongoDB
- 12. なぜmongoDBはobjectIDを使用していますか?
- 13. MongooseでObjectIdでMongoDB文書を検索
- 14. pongongoでmongodbでObjectIdで検索
- 15. (SQL Serverで動作します)Visual Studioが警告例外XMLとPROCをストアド
- 16. PROC SQL - アイテム
- 17. SAS Proc SQLデータベーステーブル挿入
- 18. SQL Serverのオプションのパラメータにprocが格納されていますか?
- 19. SyncFramworkとSQL Server
- 20. SAS PROC SQL TRIM STATEMENT
- 21. SQL Server CEのIDとしてのUniqueidentifier?
- 22. uuidをmongooseでobjectIDとして使用
- 23. mongoimportを使用してCSVファイルからMongodb ObjectIdをインポートするには?
- 24. djangoのHTMLテンプレートからmongodb要素のObjectIDを取得する
- 25. SQL Server CEとSQL Serverの同期
- 26. SQL Server ExpressとSQL Serverのパフォーマンス
- 27. SQL Server 2000とSQL Server 2008の同期
- 28. MongoDB/MorphiaはTechnical IdをObjectIdとして保存しますが、JavaのStringです
- 29. MongoDB ObjectId外部キー実装の推奨事項
- 30. mongoDB - ドキュメントIDとしてのURL
プライマリキーは、SQL Serverの型ではありません(制約事項です)。私の知る限り、他のリレーショナルデータベースのいずれかです。 SQL ServerとMongoDBのテーブルのスクリプトを私たちに教えてください。また、「テンプレートレコードをいくつか複製する」ということをもっと詳しく説明してください。 –
私は主キーが型ではなく制約であることを知っています。私は、テーブルのすべての主キー(元々はGUID)をObjectID(char(24))に置き換えました。私が尋ねるのは、SQLサーバー関数またはストアドプロシージャに新しいObjectID値を生成する方法があるのですか? – Andrey