【发布时间】: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