2015-06-30 2 views
1

Я искал SO и Google, но не смог понять смысл объяснений, и я не мог сказать, были ли они связаны.SQL-заполнители в предложении 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)) 

Когда пользователь выходит запустить отчет, ИНЕК автоматически заполнит информацию, вводимую для производства Даты и ключ клиента.

Для этого отчета мне пришлось создать несколько переменных, которые вызываются в разделе набора. Вот пример:

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 для заполнения с датой производства и ключом клиента, который пользователь вводит при запуске отчета. Есть ли способ сделать это? Сообщите мне, если мне нужно предоставить больше объяснений.

Я использую только SQL. Microsoft SQL Server 2005.

+0

Какие продукты вы используете? SQL-сервер? MySQL? Любые языки интерфейса переднего плана? Какой инструмент/язык используется для создания «отчета»? –

+0

@TabAlleman Я использую только SQL. Microsoft SQL Server 2005. – Austin

ответ

1

Да, вы можете определить переменные для определенных значений, которые вы хотите заменить. Предполагая, что это SQL Server, о котором вы говорите, это сработает, но вам нужно будет знать, что если для @key ниже будет работать не для значений, разделенных запятыми, а только для значений singleton. Если вам нужны значения, разделенные запятыми, тогда вам может понадобиться динамический 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)) 
); 
+0

, когда я пытаюсь это сделать, я получаю сообщение об ошибке [Microsoft] [драйвер SQL Server ODBC] [SQL Server] Неверный синтаксис рядом с «<». Это ошибка, которую я получаю после добавления трех переменных, а не редактирования предложения WHERE. – Austin

+0

вы должны удалить больше/меньше знаков. я обновляю свой пример выше с вашими жестко закодированными значениями. – Greg

+0

, что имеет смысл, однако, значение не всегда будет 6/24, это будет то, что пользователь вводит прямо перед запуском отчета. – Austin

Смежные вопросы