因此,我想我应该重写整个东西,因为我解决了一堆问题。这是我最新的代码:
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),
)你知道为什么这不能工作/更新吗?
发布于 2016-08-25 03:45:18
我想你的光标缺少一些逻辑。我没有看到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发布于 2016-08-25 22:16:47
好了,我找到了更新的问题所在。我的桌子完全是空白的。我添加了一个带有insert的单行(所有列的值都是1),然后运行update,它就起作用了。
这个都很好。感谢所有人的帮助。
https://stackoverflow.com/questions/39128327
复制相似问题