繁体   English   中英

SQL SERVER 2008存储过程未用CURSOR更新

[英]SQL SERVER 2008 Stored procedure NOT update with CURSOR

我不知道要执行存储过程时发生了什么。 运行时,我可以在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 ;

根据代码,以下是我了解样本数据可能涉及的表的内容:

--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不使用游标的情况下更新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

更新后,将填充CTR_table上的customname字段:

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

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

表演将如火如荼。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM