我有一個混合應用程序,部分數據(主要是遺留)存儲在SQL Server中,另一部分存儲在Mongodb中。我只是將SQL Server中的所有主鍵類型轉換爲在將新記錄插入SQL Server時在應用程序中生成的ObjectId。 現在,我發現我需要克隆一些模板記錄(一次約10-20條記錄),爲了做到這一點,我需要能夠通過SQL Server函數或存儲過程生成ObjectId值。 是否有可能,並有代碼可用?Mongodb ObjectId生成器作爲SQL Server處理器
回答
我想,你可以用NEWID這個函數產生16字節uniqueidentifier。
但在MongoDB中BSON ObjectId Datatype是一個12字節的二進制值。
試試這個
SELECT LEFT(REPLACE(CAST(NEWID() as varchar(36)),'-',''),24)
希望,這會有所幫助。
EDITED
在文章Object IDs描述BSON的ObjectID規範。格式包括:
- TimeStamp。這是一個unix風格的時間戳。它是一個有符號整數,表示1970年1月1日之前或之後秒數(UTC)012秒。
- 機器。這是計算機主機名稱的(md5)散列的前三個字節,或者MAC /網絡地址或虛擬機器ID。
- Pid。這是生成對象ID的進程的進程ID(或線程ID)的2個字節。
- 遞增。這是一個不斷遞增的值,或者如果計數器不能在語言/運行時使用,則是一個隨機數。
服務器本身和幾乎所有的驅動程序都使用上述格式。
因此,它是不可能在SQL Server中生成MongoDB ObjectID。
解決此問題的唯一方法是更改應用程序的邏輯。
這不是簡單的二進制值,它具有強大的結構 - > http://www.mongodb.org/display/DOCS/ Object + IDs#ObjectIDs-BSONObjectIDSpecification –
它不會那麼獨特... – Andrey
@Andrey對不起。你怎麼看「這不會是獨一無二的」?當然,出現2個相同的24位數字的概率大於32位數字的概率,但仍然低於我在同年成爲俄羅斯總統和美國總統的可能性。 –
這個問題很舊,但我試圖做同樣的事情。這是我想出了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
這可以這樣調用:
select NewObjectId(CRYPT_GEN_RANDOM(3))
的CRYPT_GEN_RANDOM原因(3)傳遞,是因爲調用該函數顯然是側 - 影響,它不能用於另一個功能。我寧願對計數器部分使用遞增序列,但隨機數也適用。
此外,我注意到你說你使用char(24)來存儲值。這會返回一個二進制(12),因爲這是MongoDB ObjectIds的功能。使用二進制(12)還需要一半的空間來存儲該值。
我相信這現在沒有幫助,但這是一個有趣的問題要解決。
我將嘗試以我的ObjectID C#代碼並查看是否可以將它作爲CLR函數加載到SQL Server中。這可能會帶來更好的結果和性能。
- 1. 觸發器處理SQL Server
- 2. 爲x86處理器生成彙編
- 3. PostgreSQL:生成自定義的MongoDB-ObjectID-like UUID作爲主鍵
- 4. 如何在Swift中生成MongoDB ObjectID?
- 5. MongoDB objectID成爲datatables渲染器中的[object object]
- 6. SQL Server 2008 R2/2處理器安裝
- 7. SQL Server中的多處理器用法
- 8. 作爲SQL Server中的XML處理ProcessParameters
- 9. SQL Server文檔生成器工具
- 10. SQL Server查詢生成器錯誤?
- 11. MongoDB objectID陌生人錯誤
- 12. Node + Mongodb + ObjectId不工作
- 13. 在MongoDB中生成_id與ObjectId自動生成
- 14. 將MongoDB BSON ObjectId(oid)轉換爲Objective-C中的生成時間?
- 15. 在Sql Server中自定義Sql-Server腳本生成器
- 16. Mongodb Java查詢生成器
- 17. 當使用StringObjectIdGenerator時,MongoDB C#不會爲_id/ObjectId生成值
- 18. 預處理器陣列生成
- 19. PHP圖像生成器/處理程序
- 20. 將SQL令牌生成器更改爲Java令牌生成器
- 21. 我看不到「報表生成器」,在報表管理器SQL Server 2005的
- 22. 使用Mongodb ObjectID作爲文檔ID?
- 23. 在SQL Server中爲觸發器生成腳本
- 24. SQL作業錯誤:查詢處理器未能生成查詢計劃
- 25. Symfony管理生成器:將批處理操作從選擇列表轉換爲使用管理生成器生成的對象列表中的鏈接
- 26. mongodb在保存數據時生成相同的ObjectID
- 27. SQL Server配置管理器
- 28. SQL Server IDE /管理器
- 29. SQL Server:服務器整理
- 30. 如何製作C宏預生成預處理器?
主鍵不是SQL Server中的一種類型(它是一個約束),就我所知,在其他關係數據庫中也是這樣。請給我們SQL Server和MongoDB中的表格腳本,並更詳細地解釋「克隆一些模板記錄」的含義。 –
我知道主鍵不是一個類型,而是一個約束,我說我用ObjectID(char(24))替換了我的表中的所有主鍵(最初是GUID的)。所有我問 - 有沒有一種方法可以在SQL服務器函數或存儲過程中生成新的ObjectID值 – Andrey