2013-10-06 74 views
0

我不明白爲什麼變量,@NextURLId,在這個遊標中沒有被更新。這裏是代碼應該從表中檢索(obp.URL)的唯一URL代碼遊標變量未更新

DECLARE @NextURLId INT = 1 
DECLARE @varContact_Id INT 

DECLARE GetURL_Cursor CURSOR FOR 
    SELECT DISTINCT(contact_id) 
    FROM obp.Contacts 
OPEN GetURL_Cursor 

FETCH NEXT FROM GetURL_Cursor INTO @varContact_id 
WHILE @@FETCH_STATUS = 0 
BEGIN 
-- Available URLs have the used value as NULL. Used has value of 1. 
SET @NextURLId = (SELECT MIN(id) FROM obp.URL WHERE used IS NULL) 

UPDATE obp.Contacts SET URL = (
    SELECT url from obp.URL WHERE id = @NextURLId) 
UPDATE obp.URL SET 
    used = 1, 
    contact_id = @varContact_Id, 
    date = GETDATE() 
WHERE id = @NextURLId 

FETCH NEXT FROM GetURL_Cursor INTO @varContact_id 
END; 

CLOSE GetURL_Cursor 
DEALLOCATE GetURL_Cursor 

,輸入聯繫人表中的網址,然後更新的URL表示,URL已被使用。在我看來,在URL表更新爲'used = 1'之後,當我查詢它時,代碼的下一次迭代應該得到一個新的URLId。

但是,當我運行此代碼時,我每次都得到相同的URL。毫無疑問,我錯過了一些明顯的東西,但需要一些幫助來指出。

作爲一方,如果有一個基於集合的解決方案,我很樂意聽到它。

TIA

+0

我是正確的假設,嘗試一個隨機URLID有關聯的ContactID? –

回答

0

UPDATE obp.Contacts SET URL = (
    SELECT url from obp.URL WHERE id = @NextURLId) 

更新行具有相同的。添加適當的WHERE子句像

WHERE [email protected]_id 

關於這種情況的要求:我明白,要關聯與URL的聯繫,並且有什麼不合乎邏輯的規則,以。乍看之下,我會認爲一張比賽表是正確的做法。對於我來說,把這樣的關聯放到一個單獨的表格裏,即使對這兩個關聯的對象之間的1:1關係有強烈的信念,我感覺更好。 obp.URL和obp.Contacts是維度表(我認爲/希望)。在一個不同的表中保持關聯需要一個動作,如果發生變化。在你的模型中,變化必須反映在這兩個表中。

下面是這樣一個表一個想法:

create table Contact_URL_match 
    (ID int identity (1,1) 
    ,URL_id int not null unique 
    ,contact_id int not null unique 
    ,created datetime) 

的唯一約束禁止將相同的URL或相同CONTACT_ID插入兩次。在每次插入/更新之前,先前的內容正在檢查重複內容,如果發現該操作被拒絕,則保護唯一性。

對於第一大初步行動體現新匹配試試這個(沒有測試,只是一個想法)

INSERT INTO 
    Contact_URL_match 
    (URL_id 
    ,contact_id 
    ,created) 
SELECT 
    urls.id 
    ,contacts.contact_id  
    ,getdate() 
FROM 
    (SELECT 
    DISTINCT(contact_id) 
    ,ROW_NUMBER() over (ORDER BY contact_id asc) rn 
    FROM 
    obp.Contacts) contacts 
INNER JOIN 
    (SELECT 
    id 
    ,ROW_NUMBER() over (ORDER BY id) rn 
    FROM 
    obp.URL) urls 
ON 
    contacts.rn=urls.rn 

在子查詢這兩個源表基礎上的訂單創建一個行號BY子句。然後它將子查詢的結果集與rownumber連接起來,這是一種蓄意隨機行爲。我希望你想要那樣。該連接的結果被插入到匹配表中。

如果稍後想要顯示一個新的關聯,則可以將WHERE子句添加到子查詢中,以指定要與哪個聯繫人進行匹配的URL。在選擇網址或聯繫人之前,先用NOT EXISTS檢查匹配表以確保它不在那裏使用。

編輯:語法錯誤清洗

+0

謝謝你指出where子句的問題......我知道它會是這樣的!也感謝你的建議。會給一些想法。每天發生在我身上的 – CTNorthShore

+0

。這是關於比賽表的小事......非常常用!保持空間表不含任何其他內容,並使用ID引用其內容。 –