2013-10-06 73 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引用其内容。 –