Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL 2可选参数_Tsql_Sql Server 2005_Optional Parameters - Fatal编程技术网

TSQL 2可选参数

TSQL 2可选参数,tsql,sql-server-2005,optional-parameters,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 VAR

我有一个简单的查询,如下所示:

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)
我的订单表有列组,但没有列部门

情况是这样的: 我有两个组合框。一个用于部门,第二个用于小组。 首先,我有选择:

  • 全部
  • 呼叫中心
当用户从combo1中选择某个内容时,将填充第二个。 如果他选择该选项,组组合框将具有以下选项:

  • 全部
  • 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)

我不知道它是否正确,它不知怎么起作用:)

这是查询。在前端,当选择单个组时,您将分配@group变量,就像您之前所做的那样。如果未选择单个组,则为部门指定标志。因此,如果选择了all,您可以将@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。

您可以通过union all使用填充有记录的CTE来假装拥有一个表。然后执行联接和检查。如果您愿意,可以用派生表替换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)

但我的表中没有列部门。我知道那个部门有1、2、5组。但数据库中没有任何信息:/I无法更改,您能从前端的组合框中获取部门吗?因此,如果选择了它,您将提供@department='IT'和@group=null。SQL查询在哪里定义和执行?(这是一个.net程序吗?)。您的解决方案看起来非常平滑且易于实现:)我会立即检查。这一个很好:)但我应该使用我的问题的解决方案还是这一个?我的订单表中有大约500k条记录。@Misiu如果不进行测试,我无法判断。你能用不同的参数计算两种解决方案的时间吗?是的:)测试它们不成问题。我只需要从表中选择大量数据。因为当我选择1k条记录时,它们的时间几乎相同。我将在不选择前1000名的情况下检查它们。再次感谢