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

时间:2016-08-24 16:14:04

标签: sql loops

因此,当我解决一系列问题时,我想我会重写这一切。这是我最新的代码:

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

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

2 个答案:

答案 0 :(得分:0)

我认为你的光标缺少一些逻辑。我没有看到一个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 :(得分:0)

好的,所以我想出了更新的问题。我的桌子完全是空白的。我添加了一个带插入的行(只为所有列赋值为1)然后运行更新并且它有效。

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