FROM子句取决于变量值

亚瑟·雷(Arthur Rey)

我有两个具有相同列名的表,并且我想根据一个参数值从一个或另一个获取数据。我想到的是一些类似的东西

ALTER PROCEDURE [dbo].[traxs_SyncLists_Locations_Search]

    @session_id varchar(30),
    @get_value int,
    @predicate varchar(50),
    @combo varchar(30)

AS

    SELECT
        L.id AS id, 
        L.location AS value
    FROM
        CASE 
            WHEN @combo = 'box' THEN vw_WarehouseLocationBox
            WHEN @combo = 'bay' THEN vw_WarehouseLocationBay
        END L
            LEFT JOIN traxs_temp..__LocationsSyncLists T ON T.session_id = @session_id AND T.id = L.id
    WHERE
        L.whse_no = @get_value AND
        ISNULL(T.archive, 1) = 1 AND
        L.location LIKE @predicate + '%'

这不是正确的SQL语法。经过研究,我写了

SELECT 
    L.id AS id, 
    L.location AS value
FROM
    vw_WarehouseLocationBox L
        LEFT JOIN traxs_temp..__LocationsSyncLists T ON T.session_id = @session_id AND T.id = L.id
WHERE
    @combo = 'box' AND -- TRICK
    L.whse_no = @get_value AND
    ISNULL(T.archive, 1) = 1 AND
    L.location LIKE @predicate + '%'
UNION
SELECT 
    L.id AS id, 
    L.location AS value
FROM
    vw_WarehouseLocationBay L
        LEFT JOIN traxs_temp..__LocationsSyncLists T ON T.session_id = @session_id AND T.id = L.id
WHERE
    @combo = 'bay' AND -- TRICK
    L.whse_no = @get_value AND
    ISNULL(T.archive, 1) = 1 AND
    L.location LIKE @predicate + '%'

但是我总是为重复一些代码感到难过。它只有2个表,但是如果以后有10个表(可能),我应该重复10次吗?还是我已经看到很多人反对使用动态SQL,还是应该使用动态SQL?

爱德华·科莫(Edward Comeau)

该结构看起来像typeof,其中WarehouseLocation是通用类型,而Box,Bay等是扩展类型。

您的查询似乎只需要通用信息。如果您有权这样做,我将在前两个视图vw_WarehouseLocation之上创建一个视图,并在此处使用您已经确定的联合方法维护组合逻辑,但还要包含一个附加字段“ whse_type”以标识typeof。

create view [vw_WarehouseLocation]
as

select
      [id] as [id]
    , [location] as [location]
    , [whse_no] as [whse_no]
    , 'bay' as [whse_type]
from [vw_WarehouseLocationBay]

union all

select
      [id] as [id]
    , [location] as [location]
    , [whse_no] as [whse_no]
    , 'box' as [whse_type]
from [vw_WarehouseLocationBox]

现在,您不仅可以在当前SP中加入该视图,而且可以在任何其他对象中加入此视图,而无需在此处重复逻辑,即使该视图在视图中确实显得笨拙且重复。此方法更可支持“修补设计”。

例如,

select
      L.id
    , L.location
from vw_WarehouseLocation L
left join traxs_temp..__LocationsSyncLists T
    on T.id = L.id
where L.[whse_type] = @combo

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章