当我想执行它时,我不明白我的存储过程发生了什么。 当它运行时,我可以在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 ;
答案 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
上的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
答案 1 :(得分:0)
您可能需要查看MERGE statement。这有点复杂,但您可以在单个查询中运行典型的“更新,添加不存在”方案。
表演将会进入屋顶。