Solved

Passing a parameter with Like

Posted on 2012-12-21
8
424 Views
Last Modified: 2012-12-21
I have a query that displays voided transactions, and I am passing a parameter value to the WHERE clause with like but it is not returning any rows, I know I am missing something but I can't seem to figure out what.

declare @ITEM char(1000)
set @ITEM = 'ATIGM9130'
SELECT 
[Company]='NAME',
[Source]=cast('History' as varchar(7)),
[Doc_Type]=CASE SOP30200.SOPTYPE when 1 then 'QUOTE' when 2 then 'ORDER' when 3 then 'INVOICE' when 4 then 'RETURN' when 5 then 'BACKORDER' else '' end,
[Doc_Number]=SOP30200.SOPNUMBE,
SOP30300.ITEMNMBR,
SOP30300.ITEMDESC,
SOP30300.QUANTITY,
SOP30200.ORIGNUMB,
[Doc_Date]=SOP30200.DOCDATE,
[GL_Posting_Date]=SOP30200.GLPOSTDT, 
[Invoice_Date]=SOP30200.INVODATE,
SOP30200.FUFILDAT,
SOP30200.ACTLSHIP,
SOP30200.LOCNCODE,
SOP30200.BCHSOURC,
[Batch_No]=SOP30200.BACHNUMB,
SOP30200.CUSTNMBR, 
SOP30200.CUSTNAME,
SOP30200.ADDRESS1,
SOP30200.ADDRESS2,
SOP30200.CITY,
SOP30200.[STATE],
SOP30200.CNTCPRSN,
SOP30200.PHNUMBR1, 
SOP30200.PHNUMBR2,
SOP30200.SHIPMTHD,
[Posting_Status]=CASE SOP30200.PSTGSTUS when 0 then 'NOT POSTED' when 2 then 'POSTED' else 'UNKNOWN' end,
[Void_Status]=CASE SOP30200.VOIDSTTS when 1 then 'VOIDED' else '' end,
--[Message] = CASE SOP30200.VOIDSTTS when 1 then 'Voided By will be the Batch_No for the transaction.' else '' end,
[Voided By]= CASE SOP30200.VOIDSTTS when 0 then '' else SOP30200.BACHNUMB end,
IV00101.ITMCLSCD
FROM         SOP30200 WITH(nolock) INNER JOIN
                      SOP30300 WITH(nolock)  ON SOP30200.SOPTYPE = SOP30300.SOPTYPE AND SOP30200.SOPNUMBE = SOP30300.SOPNUMBE INNER JOIN
                      IV00101 WITH(nolock)  ON SOP30300.ITEMNMBR = IV00101.ITEMNMBR
WHERE     (IV00101.ITMTRKOP = 2) AND (NOT (SOP30200.SOPTYPE = 1)) AND (SOP30300.ITEMNMBR  LIKE '%'+@ITEM+'%' )--AND SOP30300.ITEMNMBR in (select Value from dbo.parmstolist(@ITEM, ','))
ORDER BY 8 DESC

Open in new window

0
Comment
Question by:skull52
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
  • 2
  • +2
8 Comments
 
LVL 11

Expert Comment

by:David Kroll
ID: 38713382
If you take out the like condition, do results that match that item get returned?
0
 
LVL 12

Expert Comment

by:Habib Pourfard
ID: 38713397
the query syntax is correct. may be there is something wrong with the logic.

WHERE   ( IV00101.ITMTRKOP = 2 )
        AND ( SOP30200.SOPTYPE <> 1 )
        AND ( SOP30300.ITEMNMBR LIKE '%' + @ITEM + '%' )

Open in new window


for example:
- may be you need to replace AND with OR.
- make sure ITEMNMBR is varchar...
0
 
LVL 70

Expert Comment

by:Qlemo
ID: 38713400
That (commented) subquery of   select Value from dbo.parmstolist(@ITEM, ',')  points to that @item contains more than one value?
0
Salesforce Has Never Been Easier

Improve and reinforce salesforce training & adoption using WalkMe's digital adoption platform. Start saving on costly employee training by creating fast intuitive Walk-Thrus for Salesforce. Claim your Free Account Now

 

Author Comment

by:skull52
ID: 38713451
If I just use the @ITEM param without the LIKE  and enter the full item number value it works just fine. the (select Value from dbo.parmstolist(@ITEM, ',') is a stored proc that allows me to pass several values separated by a comma, which also works if I enter multiple complete Item numbers which I don't want do do. Adding an OR does not filter on the parameter value.
0
 
LVL 27

Expert Comment

by:Zberteoc
ID: 38713468
The cause could be multiple and not necessarily the LIKE clause condition. It is possible that the INNER JOIN conditions filter out the results or maybe in a different WHERE clause condition.

My advice is to run a query only with count to see which condition is actually causing the filtering out of the rows:

declare @ITEM char(1000)
set @ITEM = 'ATIGM9130'

SELECT 
	count(*) cnt
FROM         
	SOP30200 WITH(nolock) 
	
	INNER JOIN SOP30300 WITH(nolock) ON SOP30200.SOPTYPE = SOP30300.SOPTYPE AND SOP30200.SOPNUMBE = SOP30300.SOPNUMBE 
	
	INNER JOIN IV00101 WITH(nolock)  ON SOP30300.ITEMNMBR = IV00101.ITEMNMBR

WHERE    
	(IV00101.ITMTRKOP = 2) 
	
	AND (NOT (SOP30200.SOPTYPE = 1)) 
	
	AND (SOP30300.ITEMNMBR  LIKE '%'+@ITEM+'%' )

Open in new window

Start from bottom up and comment one condition at a time and then one join at a time and execute the query after each commenting action. Stop when you will get any count > 0

If you will get rows aftec commenting the LIKE condition it means that there are no ITEMNUMBERs with that format: %ATIGM9130%
0
 
LVL 12

Accepted Solution

by:
Habib Pourfard earned 500 total points
ID: 38713492
instead of declaring @item as char(1000) declare it as varchar(1000).

declare @ITEM varchar(1000)
set @ITEM = 'ATIGM9130'

Open in new window

0
 
LVL 27

Expert Comment

by:Zberteoc
ID: 38713528
Correct, pourfard is right. Declaring the variable as CHAR the comparition value will actually be:

%ATIGM9130          %

where the trailing spaces will count hence the lack of results.
0
 

Author Comment

by:skull52
ID: 38713560
Yep  it was the varchar,  I normally don't use char, I copied that declare statement from another query I did a while ago which was a char, missed that one, thanks pourfard  and thanks to all who responded.  "Happy Holidays"
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
A Stored Procedure in Microsoft SQL Server is a powerful feature that it can be used to execute the Data Manipulation Language (DML) or Data Definition Language (DDL). Depending on business requirements, a single Stored Procedure can return differe…
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

739 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question