I ran into this a bit ago and was wondering why the "Begin" & "End" is need to result in correct values. the if statement(s) is a singleton and does not require the "Begin" & "End" where multiple statements in the if would require it and if omitted would generate an execution error when trying to create/alter the procedure.
Any ideas as to why this behavior occurs in MS SQL ?????
Thanks, Craig
-- Results Set 2 Return the correct values.
SQL.
Declare @Qty DECIMAL(10,2), @UOM VARCHAR(5), @CasePack Numeric(7,1), @CaseQty Numeric(11, 4), @im_weigh_item SmallInt, @rank_wi_ven_ctg Char(1), @po_qty_uom Char(1), @po_Qty float
Select
-- these 2 Params are Const in this process
@im_weigh_item =0, @rank_wi_ven_ctg = 'C',
-- Set Values
@UOM = 'C' , @po_Qty_uom = 'M', @po_Qty = 3, @casepack =6, @Qty = 2
/*
Check and Set vars. accordingly
This Conditional Block Generates no errors, but the results are incorrect
** NO "Begin" & End"
*/
If(@im_weigh_item=1)
If(@rank_wi_ven_ctg='U')
Select @UOM = 'U'
Else
If(@po_Qty_uom != 'C' )
If(@po_Qty!=@casepack)
Select @UOM = 'U', @Qty = @Qty * @po_Qty
-- Debug
Select @po_Qty_uom as po_Qty_uom, @UOM as UOM, @casepack as casepack, @po_Qty as po_Qty, @Qty as Qty
-- Debug
-- reset vars, test 2
Select @UOM = 'C' , @po_Qty_uom = 'M', @po_Qty = 3, @casepack =6, @Qty =2
/*
*** Works *** Calcs Correctly
Check and Set vars. accordingly
*** This Block uses the "Begin" & "End"
*/
If(@im_weigh_item=1)
begin
If(@rank_wi_ven_ctg='U')
Select @UOM = 'U'
end
Else
begin
If(@po_Qty_uom != 'C' )
If(@po_Qty!=@casepack)
Select @UOM = 'U', @Qty = @Qty * @po_Qty
end
-- Debug
Select @po_Qty_uom as po_Qty_uom, @UOM as UOM, @casepack as casepack, @po_Qty as po_Qty, @Qty as Qty
-- Debug
IF statements can, by definition, only take a single SQL statement. However, there is a special kind of SQL statement which can contain multiple SQL statements, the BEGIN-END block. If you omit the BEGIN-END block, your SQL will run fine, but it will only execute the first statement as part of the IF .
if (score >= 90) grade = 'A'; The following example displays Number is positive if the value of number is greater than or equal to 0 . If the value of number is less than 0 , it displays Number is negative .
BEGIN and END are used in Transact-SQL to group a set of statements into a single compound statement, so that control statements such as IF … ELSE, which affect the performance of only a single SQL statement, can affect the performance of the whole group.
ELSE statement always binds to nearest preceding IF without ELSE, so yours
If(@im_weigh_item=1)
If(@rank_wi_ven_ctg='U')
Select @UOM = 'U'
Else
If(@po_Qty_uom != 'C' )
If(@po_Qty!=@casepack)
Select @UOM = 'U', @Qty = @Qty * @po_Qty
is interpreted as:
If(@im_weigh_item=1) begin
If(@rank_wi_ven_ctg='U') begin
Select @UOM = 'U'
end
Else begin
If(@po_Qty_uom != 'C' ) begin
If(@po_Qty!=@casepack) begin
Select @UOM = 'U', @Qty = @Qty * @po_Qty
end
end
end
end
I think the If without BEGIN and END should contain only ONE instruction. I suggest to add BEGIN .. END to every IF, to help keeping your coding consistent.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With