如何用存储过程结果填充临时表#tempPrueba的Planta字段
批量填充临时表Planta字段的解决方案
我来帮你搞定这个需求——给临时表#tempPrueba的Planta字段批量填充数据,咱们可以根据数据量大小选择不同的实现方式,下面详细说明:
先确认临时表结构与数据
你的临时表结构和数据可以用SQL这样表示:
CREATE TABLE #tempPrueba ( ID INT, FiltroID INT, Planta VARCHAR(100) -- 这里假设Planta是字符串类型,你可以根据实际字段类型调整 ) INSERT INTO #tempPrueba (ID, FiltroID, Planta) VALUES (1, 12, NULL), (2, 4, NULL), (3, 8, NULL)
方法1:游标逐条处理(适合小数据集)
如果你的临时表数据不多,用游标是最直观的方式,逐条调用存储过程并更新字段:
DECLARE @ID INT, @FiltroID INT, @PlantaResult VARCHAR(100) -- 定义游标,遍历需要填充的记录 DECLARE tempCursor CURSOR FOR SELECT ID, FiltroID FROM #tempPrueba WHERE Planta IS NULL OPEN tempCursor FETCH NEXT FROM tempCursor INTO @ID, @FiltroID WHILE @@FETCH_STATUS = 0 BEGIN -- 这里要注意存储过程的返回方式: -- 情况A:存储过程用输出参数返回Planta值 EXEC [BSC].[ftNombreCortoBSC] @pe_BSCID = @FiltroID, @po_Planta = @PlantaResult OUTPUT -- 情况B:存储过程直接返回单一行单列的结果集(如果是这种情况,替换上面的EXEC语句) -- DECLARE @temp TABLE (Planta VARCHAR(100)) -- INSERT INTO @temp EXEC [BSC].[ftNombreCortoBSC] @pe_BSCID = @FiltroID -- SELECT @PlantaResult = Planta FROM @temp -- 更新当前记录的Planta字段 UPDATE #tempPrueba SET Planta = @PlantaResult WHERE ID = @ID FETCH NEXT FROM tempCursor INTO @ID, @FiltroID END -- 清理游标 CLOSE tempCursor DEALLOCATE tempCursor -- 查看填充后的结果 SELECT * FROM #tempPrueba
方法2:集合式处理(高效,推荐大数据量)
游标是逐行处理,数据量大的时候效率会很低,咱们可以用集合操作来优化。如果能把存储过程改造成表值函数,操作会更简单:
第一步:把存储过程改成表值函数
CREATE FUNCTION [BSC].[fnNombreCortoBSC](@pe_BSCID INT) RETURNS TABLE AS RETURN ( -- 把原存储过程里获取Planta的逻辑放到这里,比如: SELECT Planta FROM YourSourceTable WHERE BSCID = @pe_BSCID )
第二步:用APPLY批量更新
UPDATE tp SET tp.Planta = fn.Planta FROM #tempPrueba tp CROSS APPLY [BSC].[fnNombreCortoBSC](tp.FiltroID) fn -- 查看结果 SELECT * FROM #tempPrueba
如果不想修改存储过程,也可以用临时表先缓存所有调用结果,再关联更新:
-- 先创建临时表存储所有FiltroID对应的Planta值 DECLARE @results TABLE (FiltroID INT, Planta VARCHAR(100)) -- 遍历每个FiltroID调用存储过程并插入结果 INSERT INTO @results (FiltroID, Planta) SELECT tp.FiltroID, (SELECT Planta FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;', 'EXEC [BSC].[ftNombreCortoBSC] @pe_BSCID = ' + CAST(tp.FiltroID AS VARCHAR(10)))) AS Planta FROM #tempPrueba tp -- 关联更新原临时表 UPDATE tp SET tp.Planta = r.Planta FROM #tempPrueba tp JOIN @results r ON tp.FiltroID = r.FiltroID -- 查看结果 SELECT * FROM #tempPrueba
注意:使用
OPENROWSET需要开启Ad Hoc Distributed Queries权限,如果你没有权限,还是优先考虑游标或者改造存储过程的方案。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

