You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用存储过程结果填充临时表#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:49:48