【问题标题】:TSQL 2 optional parametersTSQL 2 可选参数
【发布时间】:2012-04-19 17:48:22
【问题描述】:

我有一个这样的简单查询:

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 个组合框。一为部门,二为组。 首先我有选择:

  • 全部
  • 呼叫中心

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

  • 全部
  • IT1
  • IT2

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

这是将组分配给部门的方式

  • IT - 1,2,5
  • 呼叫中心 - 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)

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

【问题讨论】:

  • SQL查询在哪里定义和执行? (这是一个 .net 程序吗?)
  • 这是一个aspx格式的报告,我需要从我的标准中选择所有订单,然后处理它们并显示结果。

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


【解决方案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)

【讨论】:

  • 你第二次拯救我的一天:) 我会马上检查。您的解决方案看起来如此流畅且易于实施 :) 我会立即检查。
  • 这个工作得很好:) 但是我应该再次使用我的问题或这个问题的解决方案吗?我的订单表中有大约 50 万条记录。
  • @Misiu 未经测试我无法判断。你能用不同的参数为这两种解决方案计时吗?
  • 是的 :) 测试它们不是问题。我只需要从我的表中选择大量数据。因为当我选择 1k 条记录时,它们的时间几乎相同。我会在不选择前 1000 名的情况下检查它们。再次感谢
【解决方案2】:

这里是查询。 In the front end, when a single group is selected, you assign the @group variable, just like you did before.如果没有选择单个组,则为部门分配标志。因此,如果选择了所有 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。

【讨论】:

  • 但是我的表中没有列部门。我知道 IT 部门有 1、2、5 组。但是数据库中没有任何信息:/我无法更改
  • 你能从前端的组合框中抓取部门吗?因此,如果选择 IT,则提供 @department='IT' 和 @group=NULL
猜你喜欢
  • 2018-09-23
  • 2016-03-16
  • 1970-01-01
  • 2012-05-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多