带有Temp Table的SQL while循环

时间:2011-11-07 19:05:37

标签: sql sql-server tsql

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

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

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

我以前从未使用过while循环,似乎无法做出我见过的任何例子。

5 个答案:

答案 0 :(得分:4)

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

UPDATE 
       r 
 SET 
       r.Contact = m.SiteID + r.Contact 
 FROM 
       table1 r 
 INNER JOIN 
       #mod_contact m 
 ON m.id=r.id

你的大脑想要这样做:

while records
   update(i);  //update record i
   records = records + 1
end while

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

答案 1 :(得分:4)

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

游标是表中的一种指针,当递增时指向下一条记录。 (对于下一个循环来说,它或多或少是无关紧要的)

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

-- 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

这不是最有效的方法,但我认为这就是你要找的地方。

希望它有所帮助。

答案 2 :(得分:1)

正如其他人所提到的,学习如何在SQL中执行循环通常是一个坏主意;但是,既然你想要了解如何做某事,这里有一个例子:

DECLARE @id int

SELECT @ID =1 

WHILE @ID <= (SELECT MAX(ID) FROM table_1)
-- while some condition is true, then do the following
--actions between the BEGIN and END

BEGIN

UPDATE table_1
SET contact = CAST(siteID as varchar(100)) + contact
WHERE table_1.CID = @ID

--increment the step variable so that the condition will eventually be false

SET @ID = @ID + 1

END

--do something else once the condition is satisfied
PRINT 'DONE!!  Don't try this in production code...'

答案 3 :(得分:0)

  

需要创建一个临时表,然后更新原始表。

为什么要使用临时表?您的CID列未显示在临时表中,因此我看不到如何使用SiteID成功更新原始表,除非只有一行CID = 142在哪个使用临时表肯定是矫枉过正。

你可以这样做:

UPDATE dbo.table1
   SET contact = SiteID + contact
 WHERE CID = 142;

这是一个相关的示例,可能有助于您“在SQL中思考”:

UPDATE T
   SET A = B, B = A;

假设AB属于同一类型,则可以成功交换其值。

答案 4 :(得分:0)

试试这个:

-- DECLARE the cursor
DECLARE CUR CURSOR FAST_FORWARD READ_ONLY FOR SELECT column1,column2 FROM table

-- 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 

WHILE @@FETCH_STATUS = 0
BEGIN

    SELECT  * 
    FROM    Table2 
    WHERE   column1 = @varId
    AND column2 = @varSiteId

    FETCH NEXT FROM CUR INTO @varId, @varSiteId
END

CLOSE CUR
DEALLOCATE CUR