繁体   English   中英

循环遍历表中的行以更新循环中的列

[英]Loop through rows in table to update columns in a loop

因此,我认为在解决一系列问题时,我会重新编写整个内容。 这是我最新的代码:

    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

当前,我的问题是它不使用任何记录更新表。 我的回报看起来像这样:

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行的影响。 这是我为解决此问题而制作的临时表:

        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),
)

任何想法为什么这不起作用/更新?

我认为您的光标缺少某些逻辑。 我看不到FETCH语句,该语句将在每个递归回合中加载一个变量。 我通常会尽量避免使用游标,但在这种情况下,这听起来很合理。 无论如何,这是一篇很棒的文章,其中包含一个游标示例,可以帮助您进行清理。
https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

另外,为了利用变化的目标列,您将需要在游标体内实现动态SQL。 基本上,您将使用游标构造一个UPDATE语句,该语句针对通过游标进行的特​​定运行针对您的表/列。 UPDATE语句将存储在varchar变量中。 您可以在每次游标运行结束时运行每个语句,也可以继续为将要更新的每个表/列继续在变量后附加其他INSERT语句,然后在游标完成后运行整个程序。
从性能的角度来看,第二种选择可能会更好。

仅作为一个动态SQL的简单示例,您打算如何使用它; 您有一条注释掉的更新声明,我假设您想成为将要发生的实际操作。 您不仅需要直接运行UPDATE,还需要将该语句存储在varchar变量中,例如,

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

在随后的每次游标运行中,您都希望@Col发生变化,而@OID发生变化。 然后在末尾(每个游标运行的末尾或游标之后)运行它;

    EXEC sp_executesql @sql

好的,所以我找出了更新的问题。 我的桌子完全空白。 我在单行中添加了一个插入(所有列的值均为1),然后运行更新并成功运行。

这一切都很好。 谢谢大家的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM