2011-03-29 88 views
0

我必須準備一個腳本,用於從幾個表中選擇數據,並在表中插入新行,其中存儲某種多對多關係。T-SQL中的確定性GUID生成

因此,基本上,我有兩個表,其中uniqueidentifier字段作爲主鍵,另一個表存儲這些表中的兩個外鍵和一些附加數據。他們的主鍵也是uniqueidentifier

INSERT ResultTable ([primaryKey],[foreignA], [foreignB]) 
    SELECT newid(), /* <- Can't have it! */ 
      @foreignKeyA, 
      fb.[primaryKey] 
    FROM foreignTableB as fb 

的問題是,我不能使用newid()生成對我產生的數據的GUID。其中一個要求是腳本在相同的表上運行時產生相同的結果(包括主鍵)。所以我必須想出一個腳本,它將插入具有uniqueidentifier值的新行,該值基於另外兩個uniqueidentifier值生成。

現在,我不知道任何提供從一個GUID到另一個映射的函數。可能沒有任何。但我仍然希望聽到一些建議和意見。

另外:

  • 我們可以假設,任何一對的外鍵的是整個表中是唯一
  • 我不能改變主鍵字段類型中任何表中提到的
  • 這是主要是SQL Server 2005/2008,但有些可能運行SQL Server 2000

在此先感謝。

+0

聽起來這將是一樣一樣的服用整數#1和整數#2,並以某種方式將它們一起消除,使得整數#3可以用作主鍵。我不知道有什麼辦法可以完全確定任何兩對整數(或GUID),而不是產生相同的「輸出」整數。 (哈希算法可能會讓你關閉,如果你可以找到一個生成GUID值) – 2011-03-30 23:20:52

+0

@Philip Kelley:我敢肯定,我可以通過將兩個GUID轉換爲字符串並操作字符(重新排序它們)然後將結果字符串轉換回'uniqueidentifier'。我可能最終會做這樣的事情(儘管它非常混亂,很可能是一個壞主意),但我決定我不必 – Dyppl 2011-03-31 03:07:16

回答

2

您的最佳答案是生成一個插入語句列表的腳本。 該腳本可以從生成動態SQL字符串的其他腳本生成。 你可能會這樣迭代地調用每個循環的guid函數。

這樣最後你會得到一個插入列表,這個插入列表可以多次運行,使用guid可以得到相同的結果。

但產生的GUID的維度之一是時間,讓你將永遠無法複製的GUID(這是一種點真)

+0

感謝您的(有點晚)建議,這幾乎就是我最終的結果在昨天做。它並沒有真正回答生成'uniqueidentifier'值的問題,但它解決了我的問題,所以我正在標記你的答案。 – Dyppl 2011-03-31 03:12:52