2014-10-08 59 views
0

我敢肯定,這很容易,但我不能走過去概念化的語法:我的功能表,其中一個名叫功能可以填充幾行,例如:循環並將非唯一GUID分配給值集?

[NAME], [GUID] 
Fred, NULL 
Fred, NULL 
Fred, NULL 
Tom, Null 
Mary, Null 
Mary, Null 
Mary, Null 
Mary, Null 

我想什麼做的是分配每名ONE GUID:

Fred, {3b26af27-9d42-481c-a8c8-be1819dccda5} 
Fred, {3b26af27-9d42-481c-a8c8-be1819dccda5} 
Fred, {3b26af27-9d42-481c-a8c8-be1819dccda5} 
Tom, {ee64b706-def0-4e5c-a5fd-0c219962042e} 
Mary, {fd158f90-9705-4a18-b82c-baca29441401} 
Mary, {fd158f90-9705-4a18-b82c-baca29441401} 
Mary, {fd158f90-9705-4a18-b82c-baca29441401} 
Mary, {fd158f90-9705-4a18-b82c-baca29441401} 
+0

guid代表什麼? – 2014-10-08 16:15:09

+0

指定給與其他表關聯的名稱的唯一標識 – tpcolson 2014-10-08 16:34:28

回答

1
DECLARE @tmp TABLE 
(
    Name varchar(30), 
    GUID uniqueidentifier 
) 

INSERT @tmp 
    SELECT x.Name, NEWID() 
    FROM (SELECT DISTINCT Name FROM MyTable) x 

UPDATE MyTable 
    SET GUID = tmp.GUID 
    FROM MyTable t 
    INNER JOIN @tmp tmp ON t.Name = tmp.Name 
+0

謝謝! Upvoted – tpcolson 2014-10-08 16:42:12

0

因爲NEWID()不兌現直到詢問的最後,你需要暫時兌現它。在這裏我使用該表來更新最終目的地之前使用表變量來存儲每名一個新的GUID(通過Name分組):

DECLARE @MaterializedGuids TABLE (
    Name varchar(20), 
    NewGuid uniqueidentifier 
) 

INSERT INTO @MaterializedGuids (Name, NewGuid) 
SELECT Name, NEWID() FROM YourTable GROUP BY Name 

現在你可以使用這個在內存中的表來更新您的永久表:

UPDATE y 
SET y.[Guid] = x.[NewGuid] 
FROM YourTable y 
JOIN @MaterializedGuids x ON x.Name = y.Name 

然後檢查出來的結果:

SELECT * FROM YourTable 
0

榮譽在神祕的海報誰發佈後刪除了他的答案几分鐘後,它有點工作:

UPDATE y 
SET y.[FEATUREID] = x.[NewGUID] 
FROM TRANS_TRAILS_LN y 
LEFT OUTER JOIN (
    SELECT DISTINCT TRAILNAME, NEWID() AS NewGuid FROM TRANS_TRAILS_LN GROUP BY TRAILNAME 
) x ON x.TRAILNAME = y.TRAILNAME 
+0

這是我意識到它沒有奏效之後。我已經更新了我的答案,並將其刪除。 – 2014-10-08 16:37:11