Sql server 游标变量未更新

Sql server 游标变量未更新,sql-server,tsql,Sql Server,Tsql,我不明白为什么这个游标中的变量@NextURLId没有被更新。这是密码 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 WH

我不明白为什么这个游标中的变量@NextURLId没有被更新。这是密码

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
代码应该从一个表(obp.URL)中检索一个唯一的URL,在Contacts表中输入该URL,然后更新该URL以指示该URL已被使用。在我看来,在URL表更新为“used=1”之后,当我查询它时,下一次代码迭代应该会得到一个新的URLId

但是,当我运行这段代码时,每次都会得到相同的URL。毫无疑问,我遗漏了一些明显的东西,但需要一些帮助来指出它

作为一方,如果有一个基于集合的解决方案,我很高兴听到它

TIA

UPDATE obp.Contacts SET URL = (
    SELECT url from obp.URL WHERE id = @NextURLId)
用相同的值更新每一行。添加一个适当的WHERE子句,如

WHERE contact_id=@varContact_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或同一联系人id。在每次插入/更新之前,都会检查内容是否重复,如果发现重复,则会拒绝该操作,从而保护唯一性

要在第一个大型初始动作中显示新的匹配项,请尝试以下操作(尚未测试,只是一个想法)

在子查询中,这将基于ORDERBY子句在两个源表中创建一个行号。然后,它通过该行数将子查询的结果集连接起来,这是一种故意的随机行为。我希望你想要。该联接的结果将插入到匹配表中

如果以后要显示单个新关联,可以向子查询添加WHERE子句,指定要与哪个联系人匹配的URL。在选择URL或联系人之前,请检查不存在的匹配表,以确保其中未使用该表


编辑:语法错误清理

我是否正确地假设您尝试将URLId与ContactID随机关联?感谢您指出where子句问题。。。我就知道会是这样!谢谢你的建议。我会想一想,我每天都会遇到这种事。这是一些小事情。。。关于匹配表:非常常用!保持维度表没有任何其他内容,并使用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