BAQ fails with parameter, works with identical hardcoded value

/*
 * Disclaimer!!!
 * This is not a real query being executed, but a simplified version for general vision.
 * Executing it with any other tool may produce a different result.
 */
 
select 
	[PcConData].[TypeCode] as [PcConData_TypeCode],
	[PcConData].[Key1] as [PcConData_Key1],
	[PcConData].[Key2] as [PcConData_Key2],
	[PcConData].[Key3] as [PcConData_Key3],
	[PcConData].[Key4] as [PcConData_Key4],
	[PcConData].[Character01] as [PcConData_Character01],
	[PcConData].[ShortChar01] as [PcConData_ShortChar01],
	[PcConData].[Number01] as [PcConData_Number01],
	[PcConData].[ShortChar02] as [PcConData_ShortChar02],
	[PcConData].[Number02] as [PcConData_Number02],
	[PcConData].[Number04] as [PcConData_Number04],
	[PcConData].[Number05] as [PcConData_Number05],
	[PcConData].[Number06] as [PcConData_Number06],
	[SubQuery2].[PartUOM1_ConvFactor] as [PartUOM1_ConvFactor],
	[SubQuery2].[Part_PartLength] as [Part_PartLength],
	[SubQuery2].[Part_PartWidth] as [Part_PartWidth],
	[SubQuery2].[Part_PartHeight] as [Part_PartHeight],
	(convert(decimal(10,5), PcConData.Key2)) as [Calculated_BlMin],
	(convert(decimal(10,5), PcConData.Key3)) as [Calculated_BLMax],
	(case 
     when PcConData.ShortChar01 = '<' and @ScreenWidth < PcConData.Number01 then 1
     when PcConData.ShortChar01 = '>' and @ScreenWidth > PcConData.Number01 then 1
     when PcConData.ShortChar01 = '<=' and @ScreenWidth <= PcConData.Number01 then 1
     when PcConData.ShortChar01 = '>=' and @ScreenWidth >= PcConData.Number01 then 1
     when PcConData.ShortChar01 = '<>' and @ScreenWidth <> PcConData.Number01 then 1
     when PcConData.ShortChar01 = '=' and @ScreenWidth = PcConData.Number01 then 1
     when PcConData.ShortChar01 = '==' and @ScreenWidth = PcConData.Number01 then 1
     else 0
 end) as [Calculated_Condition1],
	(case 
     when PcConData.ShortChar02 = '<' and @ScreenWidth < PcConData.Number02 then 1
     when PcConData.ShortChar02 = '>' and @ScreenWidth > PcConData.Number02 then 1
     when PcConData.ShortChar02 = '<=' and @ScreenWidth <= PcConData.Number02 then 1
     when PcConData.ShortChar02 = '>=' and @ScreenWidth >= PcConData.Number02 then 1
     when PcConData.ShortChar02 = '<>' and @ScreenWidth <> PcConData.Number02 then 1
     when PcConData.ShortChar02 = '=' and @ScreenWidth = PcConData.Number02 then 1
     when PcConData.ShortChar02 = '==' and @ScreenWidth = PcConData.Number02 then 1
     else 0
 end) as [Calculated_Condition2]
from Erp.PcConData as PcConData
left outer join  (select 
	[PartUOM1].[Company] as [PartUOM1_Company],
	[PartUOM1].[PartNum] as [PartUOM1_PartNum],
	[PartUOM1].[UOMCode] as [PartUOM1_UOMCode],
	[PartUOM1].[ConvFactor] as [PartUOM1_ConvFactor],
	[PartUOM1].[Active] as [PartUOM1_Active],
	[PartUOM1].[TrackOnHand] as [PartUOM1_TrackOnHand],
	[PartUOM1].[NetVolume] as [PartUOM1_NetVolume],
	[PartUOM1].[NetVolumeUOM] as [PartUOM1_NetVolumeUOM],
	[PartUOM1].[HasBeenUsed] as [PartUOM1_HasBeenUsed],
	[PartUOM1].[ConvOperator] as [PartUOM1_ConvOperator],
	[PartUOM1].[WebUOM] as [PartUOM1_WebUOM],
	[PartUOM1].[SysRowID] as [PartUOM1_SysRowID],
	(isnull(PartUOM1.UOMCode, 'NULL')) as [Calculated_PClass],
	[Part].[PartLength] as [Part_PartLength],
	[Part].[PartWidth] as [Part_PartWidth],
	[Part].[PartHeight] as [Part_PartHeight]
from Erp.PartUOM as PartUOM1
inner join Erp.Part as Part on 
	PartUOM1.Company = Part.Company
	and PartUOM1.PartNum = Part.PartNum)  as SubQuery2 on 
	isnull((LEFT(PcConData.Character01, charindex(' ', PcConData.Character01) - 1)),'aaaaaaaa') = SubQuery2.PartUOM1_PartNum
	and ( SubQuery2.PartUOM1_UOMCode = 'Pieces'  )

where (PcConData.TypeCode = @MetalTable)
 and (PcConData.Key1 = @HkShape  and (convert(decimal(10,5), PcConData.Key2)) <= @Backleg  and (convert(decimal(10,5), PcConData.Key3)) >= @Backleg  and ((case 
     when PcConData.ShortChar01 = '<' and @ScreenWidth < PcConData.Number01 then 1
     when PcConData.ShortChar01 = '>' and @ScreenWidth > PcConData.Number01 then 1
     when PcConData.ShortChar01 = '<=' and @ScreenWidth <= PcConData.Number01 then 1
     when PcConData.ShortChar01 = '>=' and @ScreenWidth >= PcConData.Number01 then 1
     when PcConData.ShortChar01 = '<>' and @ScreenWidth <> PcConData.Number01 then 1
     when PcConData.ShortChar01 = '=' and @ScreenWidth = PcConData.Number01 then 1
     when PcConData.ShortChar01 = '==' and @ScreenWidth = PcConData.Number01 then 1
     else 0
 end) = true  and (case 
     when PcConData.ShortChar02 = '<' and @ScreenWidth < PcConData.Number02 then 1
     when PcConData.ShortChar02 = '>' and @ScreenWidth > PcConData.Number02 then 1
     when PcConData.ShortChar02 = '<=' and @ScreenWidth <= PcConData.Number02 then 1
     when PcConData.ShortChar02 = '>=' and @ScreenWidth >= PcConData.Number02 then 1
     when PcConData.ShortChar02 = '<>' and @ScreenWidth <> PcConData.Number02 then 1
     when PcConData.ShortChar02 = '=' and @ScreenWidth = PcConData.Number02 then 1
     when PcConData.ShortChar02 = '==' and @ScreenWidth = PcConData.Number02 then 1
     else 0
 end) = true ))

If I change this where (PcConData.TypeCode = @MetalTable) to where (PcConData.TypeCode = 'Exact Same Value') it works.

@MetalTable gives a Bad SQL error.

Replacing (PcConData.TypeCode = @MetalTable)
with
PcConData.TypeCode = convert(varchar, @MetalTable)

Gets me the correct results… But @MetalTable is already a nvarchar

Can anyone explain to me why this fixes it???

1 Like

If there is a INT val in its dataset SQL is probably casting it and erroring out during evaluation.

2 Likes

Not sure I follow. @MetalTable is defined as nvarchar as is PcConData.TypeCode – are you saying its guessing about a type somewhere instead of looking at the defined data types?

Yes

1 Like

Man that’s some Javascript style design right there. Gross

1 Like

Had this happen before is only reason I know :wink:

2 Likes