[英]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.