TSQL 2可选参数

时间:2012-04-19 09:28:34

标签: tsql sql-server-2005 optional-parameters

我有一个简单的查询:

SELECT * FROM orders

返回所有订单,简单。

我想在查询中添加可选参数。

DECLARE @group INT;
SET @group = 1 --IT1

SELECT * FROM orders WHERE group = isnull(@group, group)

这也可以。

我的问题是我需要第二个参数:

DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = 'IT'

SELECT * FROM orders WHERE /*and here add limitation with department*/ group = isnull(@group, group)

我的订单表有列GROUP,但没有列DEPARTMENT。

情况看起来像这样: 我有2个组合框。一个用于部门,第二个用于组。 首先,我有选择:

  • 所有
  • IT
  • CALL CENTER

当用户从combo1中选择某些内容时,将填充第二个。 如果他选择IT,则组合框将有选项:

  • 所有
  • IT1
  • IT2

如果用户从第一个组合部门中选择然后分组很容易,因为我只检查组 问题是当他想要部门IT的所有订单时。

以下是如何将组分配给部门

  • IT - 1,2,5
  • CALL CENTER - 4,6
  • 打印 - 3

有什么想法吗?

增加:

我创造了类似的东西:

DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = 'IT'

SELECT * FROM orders WHERE
(@department IS NULL OR (@department='IT' AND group IN (1,2,5)) OR (@department='PRINT' AND group =3))
     AND
     (@group IS NULL OR group = @group)

我不知道它是否是正确的,它以某种方式起作用:)

2 个答案:

答案 0 :(得分:1)

这是查询。在前端,当选择单个组时,您可以像以前一样分配@group变量。如果未选择任何一个组,则为department分配标志。因此,如果选择了所有IT,则将@allIT设置为1(或者其他任何内容,只要它不是NULL)并按以下步骤操作:

SELECT * FROM orders 
WHERE (@group = NULL OR group = @group)
AND
(@allIT = NULL OR group = 1 or group = 2 or group = 3)
AND
(@allCallCenter = NULL OR group = 4 or group = 5)
...

如果在组合框中未选择任何内容,请将该参数值设置为NULL。

答案 1 :(得分:1)

你可以假装你有一张桌子,使用CTE通过union all填充记录。然后执行连接和检查。如果您愿意,CTE可能会被派生表替换。

; WITH departments (DepartmentID, GroupID) as (
  select 'IT', 1
  union all
  select 'IT', 2
  union all
  select 'IT', 5
  union all
  select 'CALL CENTRE', 4
  union all
  select 'CALL CENTRE', 6
  union all
  select 'PRINT', 3
)
SELECT * 
FROM orders 
  INNER JOIN departments
     ON orders.[group] = departments.GroupID
WHERE (@Group is null OR [group] = @group)
  AND (@department is null OR DepartmentID = @department)