Цикл SQL с таблицей Temp - PullRequest
       7

Цикл SQL с таблицей Temp

1 голос
/ 07 ноября 2011

Мне нужно создать временную таблицу, а затем обновить исходную таблицу.Создание временной таблицы не является проблемой.

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 ]

4 голосов
/ 07 ноября 2011

Вы можете сделать это несколькими способами, но я думаю, что вы ищете способ с помощью курсора.

Курсор - это своего рода указатель в таблице, который при увеличении указывает на следующую запись. (это более или менее аналогично циклу «для следующего»)

Чтобы использовать курсор, вы можете сделать следующее:

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

Это не самый эффективный способ сделать это, но я думаю, это то, что вы ищете.

Надеюсь, это поможет.

4 голосов
/ 07 ноября 2011

Используйте подход, основанный на множестве - не нужно зацикливаться (из мелких деталей):

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 голос
/ 07 ноября 2011

Как уже упоминалось, изучение циклов в 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...'
0 голосов
/ 04 января 2017

Попробуйте это:

-- 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
0 голосов
/ 08 ноября 2011

необходимо создать временную таблицу и затем обновить исходную таблицу.

Зачем вообще использовать временную таблицу?Ваш столбец CID не отображается во временной таблице, поэтому я не вижу, как можно успешно обновить исходную таблицу с помощью SiteID, если только в одной строке, где CID = 142 используется временная таблица, нетопределенно излишним.

Вы можете просто сделать это:

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

Вот соответствующий пример, который может помочь вам «думать на SQL»:

UPDATE T
   SET A = B, B = A;

ПредполагаяA и B относятся к одному типу, это успешно поменяет их значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...