SQL SERVER 2008 Хранимая процедура НЕ обновляется с помощью CURSOR - PullRequest
0 голосов
/ 03 марта 2011

Я не понимаю, что происходит с моей хранимой процедурой, когда я хочу ее выполнить. пока он работает, я вижу значения в ctr.custom и ctr. [name]. ПОСЛЕ того, как запрос выполнен успешно, я пытаюсь выбрать данные из CTR_Table, и в столбцах ctr.custom и ctr. [Name] НЕТ доступных значений. (пустые данные). Таблица CTR_Table содержит ХОРОШИЕ значения!

Что не так с моим SP?

ЗДЕСЬ у вас есть мой SP:

ALTER proc [dbo].[AddOrUpdateData]
as

DECLARE  @idP int;
SET @idP = 10; //always has a valid value

DECLARE @hCodePvd int;

//get all hotel codes
DECLARE item CURSOR FOR SELECT hotel_code FROM  AnotherTableData ;

OPEN item ;

FETCH NEXT FROM item  INTO @hCodePvd ;

// для каждого кода отеля я хочу обновить 1 строку в таблице CTR_Table

WHILE @@FETCH_STATUS = 0
BEGIN 


            UPDATE ctr SET              
                ctr.custom=r1.ccode_provider,
                ctr.[name]=r1.cname_provider                
            FROM
                CTR_Table ctr  INNER JOIN   AnotherTableData r1 ON ctr.[Standard] = r1.Code
            WHERE  r1.hcode =@hCodePvd AND ctr.IDP = @idP 


    FETCH NEXT FROM item  INTO @hCodePvd ;
END

CLOSE item ;
DEALLOCATE item ;

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Исходя из кода, я понимаю, как могут выглядеть таблицы с примерами данных:

--CTR_table:
idP         standard   custom     name
----------- ---------- ---------- ----------
10          Standard1  NULL       NULL
10          Standard2  NULL       NULL
10          Standard3  NULL       NULL
10          Standard4  NULL       NULL
10          Standard5  NULL       NULL

--AnotherTableData:
hotel_code  hcode       code       ccode_provider cname_provider
----------- ----------- ---------- -------------- --------------
1           1           Standard1  ccode1         cname1
2           2           Standard2  ccode2         cname2
3           3           Standard3  ccode3         cname3
4           4           Standard4  ccode4         cname4
5           5           Standard5  ccode5         cname5

Примечание. Я ожидал, что hotel_code принадлежит одной таблице, а hcode -к другой таблице, так что эти столбцы служат точкой соединения для двух таблиц.Однако код показывает, что оба эти поля принадлежат одной и той же таблице.Два поля должны быть равны для строки в AnotherTableData, которая будет использоваться в обновлении.

Следующий запрос обновит CTR_table без использования курсоров:

DECLARE  @idP int;
SET @idP = 10; --always has a valid value

UPDATE CTR_table
SET
    CTR_table.custom = AnotherTableData.ccode_provider,
    CTR_table.[name] = AnotherTableData.cname_provider
FROM CTR_table
INNER JOIN AnotherTableData
    ON CTR_table.idP = @idp
    AND CTR_table.standard = AnotherTableData.code
    AND AnotherTableData.hotel_code = AnotherTableData.hcode

Послеобновлении, поля custom и name в CTR_table будут заполнены:

SELECT * FROM CTR_table

idP         standard   custom     name
----------- ---------- ---------- ----------
10          Standard1  ccode1     cname1
10          Standard2  ccode2     cname2
10          Standard3  ccode3     cname3
10          Standard4  ccode4     cname4
10          Standard5  ccode5     cname5
0 голосов
/ 04 марта 2011

Возможно, вы захотите взглянуть на оператор MERGE . Это немного сложно, но вы сможете запускать типичные сценарии «обновление, добавление не существует» в одном запросе.

Спектакль пройдет сквозь крышу.

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