【发布时间】:2022-01-19 05:23:49
【问题描述】:
我有以下程序。它有 4 个 select 语句,其中一个是根据传入的参数选择的。每次我必须添加一个新列时,我必须确保将它添加到所有 select 语句中。如果我错过向其中一个选择语句添加一列,则应用程序会遇到错误。我正在尝试找到一种方法,只需一个 select 语句并根据传入的参数获得适当的结果。我不想使用动态 SQL 来实现它。还有其他方法吗?谢谢!
Create Procedure usp_region_order
@regionId varchar(100),
@custId varchar(100)
As
Begin
If @regionId = 'North'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionNorth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'South'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionSouth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'East'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionEast rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'West'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionWest rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
End /* procedure ends */
【问题讨论】:
-
您为什么还要加入
regionEast、regionNorth、regionSouth或regionWest表?您没有在 where 子句或返回的列中引用它们。 -
根据传入的参数只获取region表中也有regionEast、regionWest、regionNorth、regionSouth的行。
-
我在这里看到了一个潜在的设计问题。只需有一个带有 列 的区域表来确定它是东、西等。如果这样做,您可能只需要在存储过程中进行一个查询。
-
@TimBiegeleisen 我完全同意你的看法。这是几年前设计的,现在已在应用程序的许多地方使用。重新设计它需要付出很多努力,所以我们只是在尝试解决它。
-
只需从四个区域表中创建一个视图来模拟单个区域表。
标签: sql sql-server tsql stored-procedures