首先我知道使用游标并不是最好的方法,但IT经理是一个老SQL的人,这就是他想要的方式,否则我不会这样做。
我正在使用一个存储过程,该存储过程会创建一个临时表,并尝试使用已在存储过程中连接的另一个表中的数据填充它。我似乎无法得到问题描述,需要连接的字段,以正确更新。实际上不是全部。
以下是构建临时表并尝试更新它的存储过程的一部分。
--Build problem entry
Create Table ##tmp_problem
(
prbqarnum varchar(7),
prbdesc varchar(max)
)
--Dump problem(s) into tbl based on qar#
Insert Into ##tmp_problem(prbqarnum) Select qarnum From tbl_qarbase Where currstatus = @qarstatus
--Declare tbl cursor
Declare tbl_Cursor CURSOR For
Select tbl_problems.qarnum, tbl_problems.problemdesc
From tbl_problems
Join tbl_qarbase On tbl_problems.qarnum = tbl_qarbase.qarnum
Where tbl_qarbase.currstatus = @qarstatus
--Open the tbl cursor
Open tbl_Cursor
--Fetch first row of data
Fetch next From tbl_Cursor Into @qarparm, @desc
--Declare temp problem desc variable
Declare @tmpproblem varchar(max)
--Loop to get problem data
While @@FETCH_STATUS = 0
Begin
Set @tmpproblem = (Select prbdesc From ##tmp_problem Where prbqarnum = @qarparm) + ' ' + @desc
Update ##tmp_problem Set prbdesc = @tmpproblem
--Get Next Row of Data
Fetch next From tbl_Cursor Into @qarparm, @desc
End
--Close tbl cursor
Close tbl_Cursor
--Deallocate tbl cursor
Deallocate tbl_Cursor
我知道临时表正在运行,因为在程序运行后我能够查询临时表并看到正在放入qarnum。
发生的事情是,有一个描述字段,可能有一行到N行,并且基于qar#我需要将描述连接成一个字符串,然后将其插入到temp中表,这不会发生。
这是查询输出的图片。顶部是临时表,底部是构建光标的表。
所以问题是,除了使用游标之外,我做错了什么?我一直在谷歌搜索几个小时,但似乎没有任何工作。
最后一点:我没有看到任何错误。
答案 0 :(得分:1)
你可以大大简化这一点。根本不需要更新。只需填充临时表中的两列。你可以将整个代码简化为此。
Create Table #tmp_problem
(
prbqarnum varchar(7),
prbdesc varchar(max)
)
--Dump problem(s) into tbl based on qar#
Insert Into #tmp_problem(prbqarnum, prbdesc) Select qarnum, problemdesc From tbl_qarbase Where currstatus = @qarstatus
答案 1 :(得分:0)
你应该处理NULL:
Set @tmpproblem = ISNULL(Select prbdesc From ##tmp_problem
Where prbqarnum = @qarparm), '') + ' '
+ ISNULL(@desc, '');
另外,您需要在UPDATE
Update ##tmp_problem Set prbdesc = @tmpproblem -- updates entire table
--WHERE ...