簡體   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