【问题标题】:Trouble getting value from stored procedure temp table column using cursor使用游标从存储过程临时表列中获取值时遇到问题
【发布时间】:2018-09-21 18:37:31
【问题描述】:

首先我知道使用游标并不是最好的方法,但 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 正在被放入。

没有发生的是有一个描述字段,可能有 1 到 N 行,并且基于 qar # 我需要将描述连接成一个字符串,然后将其插入临时表,这没有发生。

这是关于查询输出的图片。顶部是临时表,底部是光标所在的表。

所以问题是,除了使用光标之外,我做错了什么?我已经在谷歌上搜索了几个小时,但似乎没有任何效果。

最后一点:我在任何地方都没有看到任何错误。

【问题讨论】:

  • 你已经成功了。使用光标是我在那里看到的最大问题。紧随其后的是使用全局临时表。此外,您的 update 语句每次迭代都会更新整个全局 temp,因为您没有 where 子句。这应该是一个更新语句,整个事情都会自行修复。
  • 我要把它切换回本地临时表。我只是看到这有所作为。至于where子句那可能吧。感谢您的关注..
  • 但实际上光标不是用于此目的的正确工具。它应该是一个更新语句。在游标中这样做是一种不好的方法,除非你这样做只是为了好玩。
  • 我越是看这个,我就越是惊奇地摇头。为什么不在填充第一列的同时填充临时表?
  • 为什么不只是Update ##tmp_problem Set prbdesc = @tmpproblem WHERE prbqarnum = @qarparm?不确定这里是否需要Set @tmpproblem...

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


【解决方案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

【讨论】:

    【解决方案2】:

    您应该处理 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 ... 
    

    【讨论】:

    • @SeanLange 好收获
    猜你喜欢
    • 2017-04-02
    • 2011-09-29
    • 2011-07-03
    • 1970-01-01
    • 2011-02-18
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多