首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环通过表中的行以更新循环中的列

循环通过表中的行以更新循环中的列
EN

Stack Overflow用户
提问于 2016-08-25 00:14:04
回答 2查看 1.5K关注 0票数 0

因此,我想我应该重写整个东西,因为我解决了一堆问题。这是我最新的代码:

代码语言:javascript
运行
复制
    DECLARE @LoopC INT = 1, @MaxOID INT, 
        @OID nVARCHAR(32), @Col nVARCHAR(6), @Colv nVARCHAR(3)
 SET @MaxOID = (select count(*) from #kentmp)
 SET @Col = 'col2'
 SET @Colv = '2'

WHILE(@LoopC <= @MaxOID)
BEGIN


   SET @OID = (Select OID
   FROM #kentmp where ID = @LoopC)

   DECLARE @sql NVARCHAR(MAX) = 'update #kenintotmp set ' + @Col +' = ' + '''' + @OID + '''' 

   Print @OID
  --Print @Colv
   Print @Col
   Print @sql

 EXEC sp_executesql @sql

  SET @Colv = (select SUBSTRING(@Col, PATINDEX('%[0-9]%', @Col), LEN(@col)))
  SET @Colv = @Colv + 2
  SET @Col = 'col' + @Colv
  SET @LoopC  = @LoopC + 1        
END

目前我的问题是,它没有用任何记录更新表。我的返回值如下所示:

代码语言:javascript
运行
复制
0DE6A44203544775A164F81C264AF68B
col2
update #kenintotmp set col2 = '0DE6A44203544775A164F81C264AF68B'

(0 row(s) affected)
13FCE4FF16A44B149E116427AD47B5CE
col4
update #kenintotmp set col4 = '13FCE4FF16A44B149E116427AD47B5CE'

(0 row(s) affected)
1F81D9D6DAB04992A99CA0DC61894D7B
col6
update #kenintotmp set col6 = '1F81D9D6DAB04992A99CA0DC61894D7B'

即使我试图只在表上运行一个简单的更新,但我得到的结果是0行受影响。这是我为解决这个问题而制作的临时表:

代码语言:javascript
运行
复制
        CREATE TABLE #kenintotmp
(
    col1   varchar(255),
    col2    varchar(255),
    col3    varchar(255),
    col4    varchar(255),
    col5    varchar(255),
    col6    varchar(255),
    col7    varchar(255),
col8    varchar(255),
col9    varchar(255),
col10   varchar(255),
col11   varchar(255),
col12   varchar(255),
col13   varchar(255),
    col14   varchar(255),
    col15   varchar(255),
    col16   varchar(255),
    col17   varchar(255),
    col18   varchar(255),
    col19   varchar(255),
    col20   varchar(255),
    col21   varchar(255),
    col22   varchar(255),
)

你知道为什么这不能工作/更新吗?

EN

回答 2

Stack Overflow用户

发布于 2016-08-25 03:45:18

我想你的光标缺少一些逻辑。我没有看到FETCH语句会在每个递归循环中加载一个变量。我通常尽量避免使用游标,但在这种情况下,这听起来是合理的。无论如何,这里有一篇很棒的文章,其中有一个光标的例子,可以帮助你清理这一点。

https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

此外,为了利用不断变化的目标列,您需要在游标的主体中实现动态SQL。基本上,您将使用游标构造一个UPDATE语句,该语句针对通过游标的特定运行的表/列。UPDATE语句将存储在varchar变量中。您可以在每次游标运行结束时运行每条语句,也可以简单地继续在变量后面附加要更新的每个表/列的INSERT语句,然后在游标完成后运行整个过程。

从性能的角度来看,第二种选择可能会更好。

为了快速了解如何使用动态SQL;您有一条被注释掉的update语句,我假设您希望它是将要发生的实际操作。您需要将该语句存储在varchar变量中,而不是直接运行更新。

代码语言:javascript
运行
复制
     DECLARE @sql VARCHAR(MAX) = 'update #kenintotmp set ' + @Col +' = ' + @OID

在游标的每次后续运行中,您都会期望@Col和@OID发生变化。然后在末尾(每个游标运行的末尾或游标之后)运行以下命令;

代码语言:javascript
运行
复制
    EXEC sp_executesql @sql
票数 0
EN

Stack Overflow用户

发布于 2016-08-25 22:16:47

好了,我找到了更新的问题所在。我的桌子完全是空白的。我添加了一个带有insert的单行(所有列的值都是1),然后运行update,它就起作用了。

这个都很好。感谢所有人的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39128327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档