2016-08-24 184 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),然后运行更新,它工作。

这一个是所有的好。感谢所有的帮助。