SQL Server 插入到表中,其中包含存储的值与其他值一起输出的过程输出



>假设有一个表

CREATE TABLE [Fruit](
[FruitId] [int] NOT NULL Identity(1,1),
[Name] [nvarchar](255) NOT NULL,
[Description] [nvarchar] (255) NOT NULL,
[Param1] [int] NULL,
[Param2] [int] NULL)

存储 proc,其中它接受输入并具有名为 @description 的输出参数。我无法修改此存储的过程。

EXECUTE usp_GetFruitDescription @Name, @Description OUTPUT

现在我想插入到 [水果] 表中,如下所示。

INSERT INTO [Fruit]
Values( 
    basket.Name
    ,EXECUTE usp_GetFruitDescription basket.Name
    ,basket.Param1
    ,basket.Param2)
FROM [FruitBasketEntry] basket
WHERE basket.type is not null and basket.id > 6

如何实现这一点?我见过 INSERT INTO [table] EXECUTE usp_proc 的示例,但我还没有看到它与不是来自存储的 proc 输出的其他值一起插入。谢谢!

最好的解决方案是为您的过程传递一个表类型参数,并让整个过程在集合中完成,但由于您已经提到您无法更改该过程,因此下面是唯一的"性能不佳"选项。

DECLARE @Name        [nvarchar](255)
DECLARE @Description [nvarchar](255)
DECLARE cur CURSOR LOCAL FOR
SELECT Name
FROM [FruitBasketEntry] 
WHERE [type] IS NOT NULL AND id > 6
OPEN cur
FETCH NEXT FROM cur INTO @Name
while (@@FETCH_STATUS = 0) 
BEGIN
    --execute your procedure here
    EXECUTE usp_GetFruitDescription @Name, @Description OUTPUT
    -- Insert Statement here 
    INSERT INTO [Fruit] Values(@Name , @Description)
    FETCH NEXT FROM cur INTO @Name
END
CLOSE cur
DEALLOCATE cur

你必须使用循环逻辑来做到这一点。 没有其他方法可以将输出参数直接放入表中。 如果存储过程返回了一个表,则可以将这些行插入到另一个表中。 或者,如果使用存储函数而不是过程,则可以将其直接放入查询中。

解决此问题的最佳方法可能是使用光标。 我几乎从不推荐光标,但这是几乎需要它的一种情况。

最新更新