【问题标题】:Dynamic SQL - inserting into #temp table by executing a Stored Procedure动态 SQL - 通过执行存储过程插入 #temp 表
【发布时间】:2016-02-02 11:51:55
【问题描述】:

我遇到的问题与这里已经回答的其他问题略有不同。

我有一个存储过程,它有 1 个参数,并根据该参数返回不同的结果(列数)。在这个存储过程中,我创建了一个名为#FreightData 的表。该存储过程的结尾类似于以下内容:

IF @IncludeIDs = 0 
BEGIN 
    select [Buyer], [Contract], [Product], [Shipowner], [DespatchOrder] from  #FreightData
END
ELSE 
BEGIN
    select * from #FreightData
END

以上所有工作都成功。

然后,在另一个名为 [FreightProfile] 的存储过程中,我尝试使用以下结果填充 #temp 表:

EXEC [dbo].[EXCEL_FreightData] @IncludeIDs = 1

我使用了与 [EXCEL_FreightData] 中完全相同的 CREATE TABLE 定义(使用不同的表名 - #FreightProfile_results),并尝试使用

填充新的临时表
INSERT INTO #FreightProfile_results
EXEC [dbo].[EXCEL_FreightData] @IncludeIDs = 1

但是,我得到了错误:

列名或提供的值的数量与表定义不匹配。

我现在正在尝试使用 OPENROWSET 的解决方案,这样我就不必提供表定义来解决这个问题,但如果有人对上述问题有任何建议,将不胜感激!

【问题讨论】:

  • 尝试执行程序检查列列表是否正确。
  • 通常您会避免从存储过程中产生不一致的签名。将其设为表值函数可能会更好,您可以在其中使用 select 语句。然后你的内部 TVF 总是做同样的事情,你只把你喜欢的包含/排除逻辑放在外部包装器 SP 中(而不是放在两个单独的地方,这很容易引入错误和维护开销)

标签: sql sql-server tsql stored-procedures


【解决方案1】:

我的错!

我在表定义中复制了以下内容,因此出现了问题。

[ID] [int] identity (1,1) Not Null

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2015-10-03
    • 2020-07-05
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多