2011-12-08 21 views
3

我有一個混合應用程序,部分數據(主要是遺留)存儲在SQL Server中,另一部分存儲在Mongodb中。我只是將SQL Server中的所有主鍵類型轉換爲在將新記錄插入SQL Server時在應用程序中生成的ObjectId。 現在,我發現我需要克隆一些模板記錄(一次約10-20條記錄),爲了做到這一點,我需要能夠通過SQL Server函數或存儲過程生成ObjectId值。 是否有可能,並有代碼可用?Mongodb ObjectId生成器作爲SQL Server處理器

+0

主鍵不是SQL Server中的一種類型(它是一個約束),就我所知,在其他關係數據庫中也是這樣。請給我們SQL Server和MongoDB中的表格腳本,並更詳細地解釋「克隆一些模板記錄」的含義。 –

+0

我知道主鍵不是一個類型,而是一個約束,我說我用ObjectID(char(24))替換了我的表中的所有主鍵(最初是GUID的)。所有我問 - 有沒有一種方法可以在SQL服務器函數或存儲過程中生成新的ObjectID值 – Andrey

回答

1

我想,你可以用NEWID這個函數產生16字節uniqueidentifier

但在MongoDB中BSON ObjectId Datatype是一個12字節的二進制值。

試試這個

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

希望,這會有所幫助。

EDITED

在文章Object IDs描述BSON的ObjectID規範。格式包括:

  1. TimeStamp。這是一個unix風格的時間戳。它是一個有符號整數,表示1970年1月1日之前或之後秒數(UTC)012秒。
  2. 機器。這是計算機主機名稱的(md5)散列的前三個字節,或者MAC /網絡地址或虛擬機器ID。
  3. Pid。這是生成對象ID的進程的進程ID(或線程ID)的2個字節。
  4. 遞增。這是一個不斷遞增的值,或者如果計數器不能在語言/運行時使用,則是一個隨機數。

服務器本身和幾乎所有的驅動程序都使用上述格式。

因此,它是不可能在SQL Server中生成MongoDB ObjectID。

解決此問題的唯一方法是更改​​應用程序的邏輯。

+0

這不是簡單的二進制值,它具有強大的結構 - > http://www.mongodb.org/display/DOCS/ Object + IDs#ObjectIDs-BSONObjectIDSpecification –

+0

它不會那麼獨特... – Andrey

+0

@Andrey對不起。你怎麼看「這不會是獨一無二的」?當然,出現2個相同的24位數字的概率大於32位數字的概率,但仍然低於我在同年成爲俄羅斯總統和美國總統的可能性。 –

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 

這可以這樣調用:

select NewObjectId(CRYPT_GEN_RANDOM(3)) 

的CRYPT_GEN_RANDOM原因(3)傳遞,是因爲調用該函數顯然是側 - 影響,它不能用於另一個功能。我寧願對計數器部分使用遞增序列,但隨機數也適用。

此外,我注意到你說你使用char(24)來存儲值。這會返回一個二進制(12),因爲這是MongoDB ObjectIds的功能。使用二進制(12)還需要一半的空間來存儲該值。

我相信這現在沒有幫助,但這是一個有趣的問題要解決。

我將嘗試以我的ObjectID C#代碼並查看是否可以將它作爲CLR函數加載到SQL Server中。這可能會帶來更好的結果和性能。

相關問題