1

我有大量存储的过程,它们都执行相似的选择逻辑位:

WHERE
 @CustGroup = 'X' AND CUST_TYPE in ('X1', 'X2', 'B1', 'C1')
OR
 @CustGroup = 'Y' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2')
OR
 @CustGroup = 'Z' AND CUST_TYPE in ('X2', 'Y2', 'D1', 'D2')
OR
 @CustGroup = 'MAIN' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2', 'X2', 'Y2', 'D1', 'D2')

是否有可能:

一种)

将这些“输入”选择放入某种变量中?

@XGroup = 'X1', 'X2', 'B1', 'C1'
WHERE
 @CustGroup = 'X' AND CUST_TYPE in (@XGroup)

如果是这样 B)

将这些“in”选择集中放置在某个地方,以便它们可以与不同的存储过程重复使用?

4

3 回答 3

1

回复 B,

创建表

create table CUST_TYPE_LOOKUP (
  key varchar(10) not null,   -- or whatever type
  value varchar(10) not null  -- or whatever type
);

create index foo on CUST_TYPE_LOOKUP (key);

用数据填充它。

键1 X1
键1 X2
键1 B1
键1 C1
键2 Y1
键2 A1
键2 B2
键2 C2

然后使用:

WHERE
  @CustGroup = 'X' AND CUST_TYPE in (select value from CUST_TYPE_LOOKUP where key = 'Key1')
 OR
  @CustGroup = 'Y' AND CUST_TYPE in (select value from CUST_TYPE_LOOKUP where key = 'Key2') 
于 2012-07-01T12:35:40.967 回答
1

您可以使用临时表或表变量简化主要查询,如下所示:

DECLARE @cgt TABLE(CustGroup VARCHAR(5), CustType VARCHAR(5));

INSERT  @cgt VALUES('X','X1'), ('X','X2'), ('X','B1'), ('X','C1');
INSERT  @cgt VALUES('Y','Y1'), ('Y','A1'), ('Y','B2'), ('Y','C2');
INSERT  @cgt VALUES('Z','X2'), ('Z','Y2'), ('Z','D1'), ('Z','D2');
INSERT  @cgt VALUES('MAIN','Y1'), ('MAIN','A1'), ('MAIN','B2'), ('MAIN','C2')
, ('MAIN','X2'), ('MAIN','Y2'), ('MAIN','D1'), ('MAIN','D2');

SELECT  t.* 
FROM    MyTable t
JOIN    @cgt cgt    ON  cgt.CustGroup = @CustGroup
                    AND cgt.CustType = t.CUST_TYPE;
于 2012-07-01T16:27:15.607 回答
0

您描述的那种数组在 TSQL 中实际上是不可能的,但是您可以做一些事情。您可以使用动态 SQL 并创建一次选择条件,然后重用该位来创建剩余的查询。动态 SQL 存在性能和安全问题(如果您允许外部用户更改查询字符串)。我认为最简单的方法是根据您的常用选择标准创建一个视图或一组视图,然后 INNER JOIN 您以后针对这些视图的查询。这使您可以在一个位置快速更改视图中的逻辑,并让它影响基于它的任何其他查询。例如,如果您上面的选择标准适用于所有“前 10 名”客户:

CREATE VIEW vTopTenCustomers
AS
SELECT CustomerID
FROM Customers
WHERE
 CustGroup = 'X' AND CUST_TYPE in ('X1', 'X2', 'B1', 'C1')
OR
 CustGroup = 'Y' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2')
OR
 CustGroup = 'Z' AND CUST_TYPE in ('X2', 'Y2', 'D1', 'D2')
OR
 CustGroup = 'MAIN' AND CUST_TYPE in ('Y1', 'A1', 'B2', 'C2', 'X2', 'Y2', 'D1', 'D2')

然后,当您需要对前 10 名运行查询时,加入该视图:

SELECT *
FROM Customers
INNER JOIN vTopTenCustomers
    ON Customers.CustomerID = vTopTenCustomers.CustomerID

您需要小心您的索引 - 您可能需要 CustGroup 和 Cust_Type 上的非聚集索引以避免视图性能不佳。

于 2012-07-01T15:14:30.493 回答