Sql server 重复;在;T-SQL中的语句-它可以集中放置在某个地方吗?

Sql server 重复;在;T-SQL中的语句-它可以集中放置在某个地方吗?,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有大量的存储过程,它们都执行相似的选择逻辑位: 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_

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

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')
是否可以:

(A)

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

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

将这些“输入”选项集中放置在某个位置,以便可以与不同的存储过程一起重复使用?

响应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);
用数据填充它

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

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

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

您需要小心使用索引-您可能希望在CustGroup和Cust_类型上使用非聚集索引,以避免视图性能不佳。

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

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;

为什么不把它们放在桌子上?
SELECT *
FROM Customers
INNER JOIN vTopTenCustomers
    ON Customers.CustomerID = vTopTenCustomers.CustomerID
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;