【发布时间】:2022-01-08 07:01:44
【问题描述】:
我有一个存储过程,usp_region,它有一个包含 50 列的 select 语句作为结果集。此过程被我们应用程序中的多个其他存储过程调用。
大部分存储过程都会向这个过程传递一个参数并显示它返回的结果集。我有一个存储过程usp_calculatedDisplay,它从这个存储过程中获取列并将值插入到临时表中,并对列进行更多计算。
这是usp_calculatedDisplay中的部分代码。
Begin Procedure
/* some sql statements */
Declare #tmptable
(
-- all the 50 columns that are returned from the usp_region procedure
)
Insert Into #tmptable
exec usp_region @regionId = @id
Select t.*, /* a few calculated columns here */
From #tmptable t
End of procedure
每次我在usp_region 过程中添加一列时,我还必须确保我必须将它添加到此过程中。否则它会破裂。维护它变得很困难,因为当将列添加到usp_region 时,很可能有人会错过将列添加到usp_calculatedDisplay 过程。
为了克服这个问题,我决定这样做:
Select *
Into #tmptable
From OPENROWSET('SQLNCLI',
'Server=localhost;Trusted_Connection=yes;',
'EXEC [dbo].[usp_region]')
问题是“即席分布式查询”组件已关闭。所以我不能用这种方法来克服这个问题。我想知道是否有任何其他方法可以克服这个问题。我真的很感激任何帮助。谢谢!
【问题讨论】:
-
您可以调查的一个选项是使用
sp_describe_first_result_set并动态构建表格。 -
usp_calculatedDisplay第一次遇到ShoeWidth列时,应该自动执行什么计算? -
你正在解决一个更大的问题。您的架构正在发生变化,没有人在管理更改过程或似乎使用任何工具来帮助评估架构更改的影响。无论如何使用
SELECT *是一个坏习惯,但一种选择是将ups_region 更改为TVF,这样您就不需要使用临时表了。 -
谢谢大家的回复。非常感谢!
-
@stu 这是我绝对可以调查的事情
标签: sql sql-server tsql stored-procedures