因此,当我解决一系列问题时,我想我会重写这一切。这是我最新的代码:
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),
)
任何想法为什么这不起作用/更新?
答案 0 :(得分:0)
我认为你的光标缺少一些逻辑。我没有看到一个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 :(得分:0)
好的,所以我想出了更新的问题。我的桌子完全是空白的。我添加了一个带插入的行(只为所有列赋值为1)然后运行更新并且它有效。
这一切都很好。谢谢大家的帮助。