SQL While循环与临时表

Tra*_*vis 2 sql t-sql sql-server

我需要创建一个临时表,然后更新原始表。创建临时表不是问题。

create table #mod_contact
( 
    id INT IDENTITY NOT NULL PRIMARY KEY,
    SiteID INT,
    Contact1 varchar(25)
)

INSERT INTO #mod_contact (SiteID, Contact1)
select r.id, r.Contact  from dbo.table1 r where CID = 142
GO
Run Code Online (Sandbox Code Playgroud)

现在,我需要遍历表并更新r.contact = SiteID + r.contact

我以前从未使用过while循环,而且似乎无法提供我所见过的任何示例。

Jon*_*onH 6

使用基于集合的方法 - 无需循环(从小细节):

UPDATE 
       r 
 SET 
       r.Contact = m.SiteID + r.Contact 
 FROM 
       table1 r 
 INNER JOIN 
       #mod_contact m 
 ON m.id=r.id
Run Code Online (Sandbox Code Playgroud)

你的大脑想要这样做:

while records
   update(i);  //update record i
   records = records + 1
end while
Run Code Online (Sandbox Code Playgroud)

SQL 是基于设置的,允许您获取一大堆记录并在单个命令中更新它们。这样做的好处是您可以使用该WHERE子句来过滤某些不需要的行。


小智 5

您可以通过多种方式执行此操作,但是我认为您正在寻找一种使用游标的方式。

游标是表中的一种指针,增量时指向下一条记录。(或多或少类似于for-next循环)

要使用游标,您可以执行以下操作:

-- DECLARE the cursor
DECLARE CUR CURSOR FAST_FORWARD READ_ONLY FOR SELECT id, siteId, contract FROM #mod_contract

-- DECLARE some variables to store the values in
DECLARE @varId int
DECLARE @varSiteId int
DECLARE @varContract varchar(25)

-- Use the cursor
OPEN CUR
FETCH NEXT FROM CUR INTO @varId, @varSiteId, @varContract

WHILE @@FETCH_STATUS = 0
BEGIN

UPDATE dbo.table1
SET contract = @varSiteId + @varContract -- It might not work due to the different types 
WHERE id = @varId 

FETCH NEXT FROM CUR INTO @varId, @varSiteId, @varContract
END

CLOSE CUR
DEALLOCATE CUR
Run Code Online (Sandbox Code Playgroud)

这不是完成此任务的最有效方法,但是我认为这是您所寻找的。

希望能帮助到你。