【发布时间】:2019-02-20 19:32:10
【问题描述】:
下面是我当前存储过程的伪代码。首先,我有一个创建临时表的巨大查询。然后,我在存储过程中有其他查询正在查询该临时表。
我的目标是让我的存储过程更具可读性。巨大的查询使它变得困难,因为它占用了太多空间。我已经尝试为这个巨大的查询创建一个单独的存储过程来创建一个临时表,但是无法在其他存储过程之外访问临时表。
有谁知道编写此代码的更易读的方式?如果我的问题没有意义,那么我会改写它。谢谢。
Alter Procedure spMyStoredProc
Begin
--Value of 1 for each param means I want to execute the query
@sqlQueryA Bit = 0,
@sqlQueryB Bit = 0,
@sqlQueryC Bit = 0
Select Columns
Into #MyTempTable
From **HUGE Query**
If @sqlQueryA = 1
Begin
Select * From #MyTempTable
End
Else If @sqlQueryB = 1
...
Else If @sqlQueryC = 1
Begin
Query something else from #MyTempTable
End
Else
Return
End
以下是 Evaldas Buinauskas 和我在此线程上讨论的一个附带问题: 我在下面添加了包含内联表值函数的代码。我的 HUGE 查询有几个局部变量。下面是伪代码。该代码导致错误。
CREATE FUNCTION fn_myFunction()
RETURNS TABLE
AS
RETURN
(
--Declaration is not allowed
Declare @myLocalVar As DateTime
Set @myLocalVar = '2019-01-10'
#HUGE Query
Where SomeColumn = @myLocalVar
)
【问题讨论】:
-
问题:使它可读的问题是什么?使用间距/cmets 使其更清洁。您可以将较大的查询分离到它自己的 SP 中,并在 temp db 之外使用一个永久表并将其命名为 StagingSomething,但除非您在其他地方使用它,否则它会变得更加复杂。
-
这并不是一种更易读的方式,但它的性能有时会很糟糕,而其他时候则完全没问题。您需要考虑对此进行一些修改。 sqlinthewild.co.za/index.php/2009/09/15/…
-
我不是粉丝,但你看过 Insert-Exec blog.sqlauthority.com/2013/05/27/…
-
可读性不如性能重要,你同意吗?我不会为了确定从中选择什么而将大量查询包含在临时表中的多种可能性。相反,我会创建一个参数化该查询,并在需要时将其嵌套在 proc 中。
-
小字体?但说真的,将庞大的查询设为视图会将其移出您的存储过程。有些人不喜欢这种方法,但我认为没有问题
标签: sql sql-server stored-procedures temp-tables code-readability