2016-08-24 182 views
0

所以我想,我通過了一堆的問題,工作我會重新寫這整個事情的更新列。這是我最新的代碼:遍歷錶行的循環

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

任何想法爲什麼這不工作/更新?

+1

告訴我們你做了什麼,什麼是你期望的輸出 – Ravi

+0

我使用光標的OID循環,但我的想法是有列名作爲一個變量(如果有問題可能會發生變化,同時循環速度),但即時通訊不確定如何做到這一點。我的想法是從一個int開始,並轉換爲varchar用於where列名稱是更新的一部分,但正如我所說我有點失落。 – KRM

回答

0

我覺得你的光標缺少一些邏輯。我沒有看到一個FETCH語句,它會在每個遞歸輪上加載一個變量。我通常嘗試並避免使用遊標,但在這種情況下,它聽起來很有保證。無論如何,這裏有一個很棒的文章,裏面有一個光標的例​​子來幫助你清理它。
https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

此外,爲了利用改變的目標列,您需要在遊標體中實現動態SQL。基本上,您將使用遊標構造一個UPDATE語句,該語句將針對您的表/列針對該遊標中的特定運行。 UPDATE語句將存儲在一個varchar變量中。您可以在每次遊標運行結束時運行每條語句,或者簡單地繼續爲將要更新的每個表/列繼續添加附加INSERT語句的變量,然後在遊標完成後運行整個事件。
從性能角度來看,第二種選擇可能會更好。

只爲你打算如何使用它動態SQL的一個簡單的例子; 你有一條註釋掉的更新語句,我會假設你想成爲將要發生的實際動作。 而不是僅僅直接運行更新,您將需要存儲聲明爲varchar變量一樣,

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

光標的每個後續運行,你會期望@col改變和@OID改變。然後在結束處(每個遊標運行結束或遊標結束後)運行此操作;

EXEC sp_executesql @sql 
+0

我最終將其更改爲while循環,因爲這往往比光標好一點。動態SQL是我錯過了...一個肯定的站點,謝謝!我現在唯一剩下的問題是它不會更新表格。 – KRM

0

好吧,所以我想出了更新的問題。我的桌子完全是空白的。我添加了一個插入行(只給所有列的值爲1),然後運行更新,它工作。

這一個是所有的好。感謝所有的幫助。