WHERE子句中的SQL占位符

时间:2015-06-30 18:27:49

标签: sql-server placeholder

我搜索了SO和Google,但无法理解解释,也无法判断它们是否相关。

这是此报告的WHERE子句:

WHERE 
    (IC_ProductLots.ProductionDate >= { ts '2015-06-24 00:00:00' }   AND (IC_ProductLots.ProductionDate <= { ts '2015-06-24 00:00:00' } OR IC_ProductLots.ProductionDate Is Null)) 
AND ((1=1)  AND AR_Customers.CustomerKey IN (124) ) 

当用户开始运行报表时,WHERE子句会自动填充他们为生产日期输入的信息以及客户密钥。

对于此报告,我必须创建在set部分中调用的几个变量。这是一个例子:

SET @Shrink  = @InputWeight - (
 SELECT Sum([ICPL].[OriginalQuantity_Stk])
 FROM IC_Products [PC] 
 INNER JOIN DC_Transactions [DCT] 
 ON [PC].ProductKey = [DCT].ProductKey
 INNER JOIN AR_Customers 
 ON [DCT].CustomerKey = AR_Customers.CustomerKey
 INNER JOIN IC_ProductLots [ICPL] 
 ON [DCT].LotKey = [ICPL].LotKey
 LEFT OUTER JOIN IC_ProductCosts [ICP] 
 ON ICP.ProductKey=PC.ProductKey and ICP.ProductCostCode=5
 WHERE (ICPL.ProductionDate >= { ts '2015-06-24 00:00:00' } AND (ICPL.ProductionDate <= { ts '2015-06-24 00:00:00' } OR ICPL.ProductionDate Is Null)) 
AND ((1=1) AND AR_Customers.CustomerKey IN (124)) 
);

对于SET区域中的这个WHERE子句,我需要WHERE子句来填充用户在运行报告时输入的生产日期和客户密钥。有没有办法做到这一点? 如果我需要提供更多解释,请告诉我。

我只使用SQL。 Microsoft SQL Server 2005.

1 个答案:

答案 0 :(得分:1)

是的,您可以为要替换的特定值定义变量。假设这是您正在讨论的SQL Server,这将有效,但您必须知道,如果对于@key,以下将不适用于逗号分隔值,仅适用于单例值。如果需要逗号分隔值,则可能需要动态sql。我抓住了数据类型,根据需要修复。

declare @ts1 datetime,
    @ts2 datetime,
    @key int;

set @ts1 = '2015-06-24 00:00:00';
set @ts2 = '2015-06-24 00:00:00';
set @key = 124;

SET @Shrink  = @InputWeight - (
 SELECT Sum([ICPL].[OriginalQuantity_Stk])
 FROM IC_Products [PC] 
 INNER JOIN DC_Transactions [DCT] 
 ON [PC].ProductKey = [DCT].ProductKey
 INNER JOIN AR_Customers 
 ON [DCT].CustomerKey = AR_Customers.CustomerKey
 INNER JOIN IC_ProductLots [ICPL] 
 ON [DCT].LotKey = [ICPL].LotKey
 LEFT OUTER JOIN IC_ProductCosts [ICP] 
 ON ICP.ProductKey=PC.ProductKey and ICP.ProductCostCode=5
 WHERE (ICPL.ProductionDate >= @ts1 
    AND (ICPL.ProductionDate <= @ts2
        OR ICPL.ProductionDate Is Null)) 
AND ((1=1) AND AR_Customers.CustomerKey IN (@key)) 
);