SQL SERVER 2008存储过程不使用CURSOR更新

时间:2011-03-03 19:47:42

标签: sql sql-server tsql

当我想执行它时,我不明白我的存储过程发生了什么。 当它运行时,我可以在ctr.custom和ctr。[name]中看到值。 在成功执行查询后,我尝试从CTR_Table中选择数据,并且在ctr.custom和ctr。[name]列中没有可用的值。 (空数据)。 CTR_Table表包含GOOD值!

我的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 ;

//我希望在CTR_Table表中更新1行的每个酒店代码

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 个答案:

答案 0 :(得分:1)

根据代码,我理解了所涉及的表格与样本数据的相似之处:

--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上的nameCTR_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

答案 1 :(得分:0)

您可能需要查看MERGE statement。这有点复杂,但您可以在单个查询中运行典型的“更新,添加不存在”方案。

表演将会进入屋顶。