【问题标题】:How to INSERT INTO [second temp table] FROM [stored procedure returning two tables]如何从 [返回两个表的存储过程] INSERT INTO [第二个临时表]
【发布时间】:2014-05-07 13:55:54
【问题描述】:

我有一个现有的存储过程,它本质上返回两个表,第一个表只是未命名列中的一个整数,第二个表有命名列的行。

我需要构建一个新的存储过程来执行现有存储过程并使用现有存储过程返回的第二个表中的数据,并忽略第一个表/整数。

以下是我的尝试,但由于第一个表/整数,它返回错误“列名或提供的值的数量与表定义不匹配”。

CREATE PROCEDURE [dbo].[New_StoredProcedure]
AS
BEGIN
CREATE TABLE #temptable(X VARCHAR(20), Y INT, Z VARCHAR(100))
INSERT INTO #temptable(X, Y, Z)
EXEC [Existing_StoredProcedure]
    @a = '1',
    @b = '2',
    @c = '3'

SELECT * FROM #temptable
DROP TABLE #temptable
END

有没有办法写这个忽略第一个表/整数?

【问题讨论】:

  • 不,没有解决方法。请参阅INSERT:“如果 execute_statement 与 INSERT 一起使用,则每个结果集必须与 table 或 column_list 中的列兼容。”没有如果、但是或例外,只有那句话。
  • 没有 T-SQL 方法可以读取第二个或更多结果集。但是可以使用SQLCLR extended procedure
  • [Existing_StoredProcedure] 的输出是否存储在 temp、global temp 或 perm 表中?
  • 或者您可以在存储过程中添加一个附加参数来控制返回哪个结果集,然后在运行时通过将值传递给该参数来决定返回什么结果集。
  • 看起来侵入性最小的方法是从我的 .NET 源代码中调用现有的存储过程并获取返回的第二个表,然后从我的新存储中获取结果过程,然后在代码隐藏中进行我的数据操作和合并。

标签: sql sql-server stored-procedures


【解决方案1】:

您可以控制返回的结果集的另一种方法是添加一个附加参数,该参数将决定调用存储过程时返回的结果集数量和哪些结果集。

例如,在您的[Existing_StoredProcedure] 中,您可以执行类似.....

ALTER PROCEDURE [Existing_StoredProcedure]
@a    VARCHAR(10),
@b    VARCHAR(10),
@c    VARCHAR(10),
@ResultSet INT = NULL    --<-- Indicator Param
AS 
BEGIN
  SET NOCOUNT ON;

  -- Common code that executes regardless of what result set is required


  -- Now return the result set based on value passed to @ResultSet       
  IF (@ResultSet = 1 OR @ResultSet IS NULL)
    BEGIN
       -- Code for 1st result set  
    END

  IF (@ResultSet = 2 OR @ResultSet IS NULL)
    BEGIN
       -- Code for 2nd result set  
    END

END 

现在,如果您不向 @ResultSet 参数传递任何值,则将返回两个结果集,但如果您传递 1 或 2 ,则只会返回相对结果集。

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2016-10-06
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2011-11-06
    相关资源
    最近更新 更多