在创建#TempTable时,如果在存储过程中ELSE

时间:2016-04-05 21:32:52

标签: sql sql-server sql-server-2008 stored-procedures

我试图让这个存储过程仅在函数等于特定ID号时返回特定行。例如,if @RentalOnly = 'Y'只返回productID所在的行' 3367&#39}。或者! 3367G'然后if @RentalOnly = 'N'会返回其中没有productID的所有其他行。

这是我到目前为止所拥有的。

alter Procedure [dbo].GetAllProductIDs
    @StartDate datetime,
    @EndDate datetime,
    @RentalOnly char(1)
AS
begin
    SET NOCOUNT ON;

    CREATE TABLE #GetAllProductIDs
    (      
        [Status] nvarchar(30),
        [To Set Date] datetime,
        [Order ID] int,
        [Product ID] nvarchar(10),
        [PPArea] char(2),
        [OrderLineNo] nvarchar(10),
        [OrigSalesman] nvarchar(30),
        [Enterby] int,
        [Rental Month] int,
        [Quantity] int,
        [Quoted$] money,
        [EXT$] money,
        [Mo Base Rental] money,
        [Ext. Base Rental] money,
        [Quoted Mo Rent] money,
        [3367 Total$ vs. Base Total$] money,
        [3367 % Total vs. Base Total] float
    )

    insert #GetAllProductIDs
       exec TempPower_AZ.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_LV.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_OC.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_SD.dbo.GetAllProductIDs @StartDate, @EndDate

    insert #GetAllProductIDs
       exec TempPower_RS.dbo.GetAllProductIDs @StartDate, @EndDate

    if (@RentalOnly = 'Y')
    begin
        Select * 
        from #GetAllProductIDs
        where [Product ID] in ('3367', '3367G')

        return
    end

    if (@RentalOnly = 'N')
    begin
        Select * 
        from #GetAllProductIDs
        where [Product ID] not in ('3367', '3367G')

        return
    end
end

2 个答案:

答案 0 :(得分:1)

我会完全放弃IF / ELSE逻辑,只需在这样的单个查询中完成所有操作:

SELECT
    *
FROM 
    #GetAllProductIDs
WHERE 
    (@RentalOnly = 'Y' AND productID IN ('3367', '3367G')) 
OR  (@RentalOnly = 'N' AND productID NOT IN ('36367, '3367G'))

答案 1 :(得分:1)

问:如何根据输入到@RentalOnly中的这两个值(' Y'或者' N')返回行,如果没有输入任何内容,它将返回所有的产品ID

答:要返回所有productID,只需运行没有WHERE子句的SELECT。

但是如果没有输入那么"条件是""

我们会考虑@RentalOnly的哪些值或值来满足条件"如果没有输入"?这个条件是否满足于NULL?空间?一个'W'?任何字符除了' Y'或者' N'?

如果这是我们想要实现的逻辑:

IF @RentalOnly is 'Y', return the specified subset from the table
ELSE IF @RentalOnly is 'N', return a different subset from the table
ELSE (for all other values of @RentalOnly) return the whole table

作为如何使用IF...ELSE块实现该逻辑的示例......

IF (@RentalOnly = 'Y')
  Select * from #GetAllProductIDs where [Product ID] in ('3367', '3367G')
ELSE
  BEGIN
    IF (@RentalOnly = 'N')
      Select * from #GetAllProductIDs where [Product ID] not in ('3367', '3367G')
    ELSE
      Select * from #GetAllProductIDs
  END
RETURN

ELSE并非绝对必要。如果我们对条件进行编码以使它们相互排斥,我们可以得到与此相同的结果:

IF (@RentalOnly = 'Y')
  Select * from #GetAllProductIDs where [Product ID] in ('3367', '3367G')
IF (@RentalOnly = 'N')
  Select * from #GetAllProductIDs where [Product ID] not in ('3367', '3367G')
IF (@RentalOnly IS NULL OR @RentalOnly NOT IN ('Y','N')
  Select * from #GetAllProductIDs
RETURN

正如DavidG在答案中指出的那样,根本不需要使用IF。那" if else"逻辑可以移动到单个SELECT语句的WHERE子句中。例如:

Select * from #GetAllProductIDs
 WHERE ( @RentalOnly IN ('Y') AND [Product ID] IN ('3367', '3367G') )
    OR ( @RentalOnly IN ('N') AND [Product ID] NOT IN ('3367', '3367G') ) 
    OR ( @RentalOnly NOT IN ('Y','N') OR @RentalOnly IS NULL )
RETURN