无法使用游标

时间:2018-04-11 18:49:54

标签: sql-server sql-server-2008 tsql stored-procedures

首先我知道使用游标并不是最好的方法,但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中表,这不会发生。

这是查询输出的图片。顶部是临时表,底部是构建光标的表。

enter image description here

所以问题是,除了使用游标之外,我做错了什么?我一直在谷歌搜索几个小时,但似乎没有任何工作。

最后一点:我没有看到任何错误。

2 个答案:

答案 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 ...