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)
我的订单表有列组,但没有列部门
情况是这样的:
我有两个组合框。一个用于部门,第二个用于小组。
首先,我有选择:
- 全部
- 它
- 呼叫中心
- 全部
- 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名的情况下检查它们。再次感谢