减少存储过程中"WHERE"可能性



我得到了一个应用程序,调用存储过程来获取结果。来自应用程序的输入是这样的:

  1. Group - nullable
  2. 名称-可为空。如果我填写Name, ID不需要填写
  3. ID -可为空。如果填写ID,则无需填写Name
  4. 段-不可为空。输入可以是ALL段
  5. Period - not null

想到我的"WHERE"可能性是12种可能性。

  1. 段时期
  2. 段、周期、ID
  3. 段、周期、名称
  4. 段、周期、组
  5. 段、周期、组、ID
  6. 段、周期、组、名称

  7. ALL Segment, Period

  8. 所有段,周期,ID
  9. 所有段、周期、名称
  10. 所有段、周期、组
  11. 所有段、周期、组、ID
  12. 所有段、周期、组、名称

,查询示例如下:

IF @Group IS NOT NULL AND @ID IS NOT NULL AND @Segment = 'KIDS'
BEGIN
   SELECT * FROM mytable
   WHERE Group = @Group AND ID = @ID AND Segment = @Segment
END

是否有办法缩短可能性,这样查询就少写了?

谢谢

非动态SQL版本:

SELECT * 
FROM mytable 
WHERE 1 = 1
    AND (Period = @Period)
    AND (@Segment = 'ALL' OR Segment = @Segment)
    AND (@Group IS NULL OR Group = @Group)
    -- Assume one of @Name or @Id is not null
    AND (@Id IS NULL OR Name = @Name)
    AND (@Name IS NULL OR Id = @Id)

答案如下:我写下了一些代码

DECLARE @query nvarchar(1000), @where nvarchar(1000), @Group varchar(10), @ID varchar(10), @Segment varchar(10)
SET @where = ''
SET @query = 'SELECT * FROM mytable'
IF @Group IS NOT NULL
SET @where = @where + ' AND Group = @_Group '
IF @ID IS NOT NULL
SET @where = @where + ' AND ID = @_ID '
IF @Segment IS NOT NULL
SET @where = @where + ' AND Segment = @_Segment '
IF LEN(@where) > 0
SET @query = @query + ' WHERE ' + RIGHT(@where, LEN(@where)-3)

我用空字符串设置了变量@where。因为如果没有,@where不能被连接,因为@where的默认值是null

使用NVARCHAR而不是VARCHAR查询

调用@query:

EXECUTE sp_executesql @query, N'@_Group varchar(100), @_ID varchar(100), @_Segment varchar(100)', @_Group = @Group, @_ID = @ID, @_Segment = @Segment

最新更新