'Multi-value parameter in SSRS not working with select all : An expression of nonboolean type specified context where a condition is expected, near ','

The report runs fine if you select a single branch, but it breaks when you select more than one or 'Select All'.

So this is my query that I added to SSRS, I'm certain the issue is with the @Branch, but I'm not too sure where, I'm running 3 queries similar to this, but all 3 are breaking, so I just need help with one in order to do the rest.

--Declare @ReportDate as Date = '2022-02-22'
--Declare @Capturer as varchar(50) = 'TestName'
--Declare @Branch as varchar(50) = 'TestBranch'

DROP TABLE IF EXISTS #PIA1;


SELECT CONVERT(char(10), CAST(GETDATE() AS date), 126) AS Date,
       CASE WHEN LEN(bc.Code) = 3 THEN '0' + bc.Code ELSE bc.Code END AS Code,
       '30200' AS Account,
       'E' AS VatCode,
       CASE
            WHEN cde.data20 LIKE 'SBV%'
             AND amount NOT LIKE '%.00' THEN 'Bulk Deposit Coins' + ' ' + CONVERT(varchar, Data55, 103)
            ELSE 'Bulk Deposit Unfit' + ' ' + CONVERT(varchar, Data55, 103)
       END AS Description,
       '' AS TransCode,
       'D' AS DC,
       cda.Amount AS Amount,
       'GL Movements' AS Category,
       'Bulk Banking To SBV' AS Reason,
       'FCS' + ' ' + bc.Branch AS [Client Name],
       @Capturer AS Capturer
INTO #PIA1
FROM comparabledata cda (NOLOCK)
     JOIN comparabledetail cde (NOLOCK) ON cda.ComparableDetailId = cde.Id
     JOIN Custom_Test_TestCodes bc (NOLOCK) ON cde.data1 = bc.Abbreviation
WHERE ComparisonAccountId = 1
  AND data55 = @ReportDate
  AND bc.Branch IN (@Branch)
  AND data20 LIKE 'SBV%'
  AND data2 LIKE 'Ned_Clearance%'
  AND iscancelled = 0
  AND IsDeleted = 0;


DROP TABLE IF EXISTS #PIA2;
SELECT CONVERT(char(10), CAST(GETDATE() AS date), 126) AS Date,
       CASE WHEN LEN(bc.Code) = 3 THEN '0' + bc.Code ELSE bc.Code END AS Code,
       '30100' AS Account,
       'E' AS VatCode,
       CASE
            WHEN cde.data20 LIKE 'SBV%'
             AND amount NOT LIKE '%.00' THEN 'Bulk Deposit Coins' + ' ' + CONVERT(varchar, Data55, 103)
            ELSE 'Bulk Deposit Unfit' + ' ' + CONVERT(varchar, Data55, 103)
       END AS Description,
       '' AS TransCode,
       'C' AS DC,
       cda.Amount AS Amount,
       'GL Movements' AS Category,
       'Bulk Banking To SBV' AS Reason,
       'FCS' + ' ' + bc.Branch AS [Client Name],
       @Capturer AS Capturer
INTO #PIA2
FROM comparabledata cda (NOLOCK)
     JOIN comparabledetail cde (NOLOCK) ON cda.ComparableDetailId = cde.Id
     JOIN Custom_Test_TestCodes bc (NOLOCK) ON cde.data1 = bc.Abbreviation
WHERE ComparisonAccountId = 1
  AND data55 = @ReportDate
  AND bc.Branch IN (@Branch)
  AND data20 LIKE 'SBV%'
  AND data2 LIKE 'Ned_Clearance%'
  AND iscancelled = 0
  AND IsDeleted = 0;

--*******************************************************************************************---
DROP TABLE IF EXISTS #FC2;
SELECT SUM(cda.Amount) * -1 AS B
INTO #FC2
FROM ComparableData cda (NOLOCK)
     JOIN ComparisonAccount ca (NOLOCK) ON cda.ComparisonAccountId = ca.Id
     JOIN ComparableDetail cde (NOLOCK) ON cda.ComparableDetailId = cde.id
     JOIN Custom_Test_TestCodes bc (NOLOCK) ON cde.Data1 = bc.Abbreviation
WHERE ComparisonAccountId = 1 --ISA
  AND Data55 = @ReportDate
  AND Data27 LIKE 'Withdrawal%'
  AND bc.Branch IN (@Branch)
  AND IsDeleted = 0
  AND IsCancelled = 0
  AND Data2 LIKE 'NED_Clearance%';




DROP TABLE IF EXISTS #FC1;
SELECT SUM(cda.Amount) AS A
INTO #FC1
FROM ComparableData cda (NOLOCK)
     JOIN ComparisonAccount ca (NOLOCK) ON cda.ComparisonAccountId = ca.Id
     JOIN ComparableDetail cde (NOLOCK) ON cda.ComparableDetailId = cde.id
     JOIN Custom_Test_TestCodes bc (NOLOCK) ON cde.Data1 = bc.Abbreviation
WHERE ComparisonAccountId = 1 --ISA
  AND Data55 = @ReportDate
  AND Data27 LIKE 'Deposit%'
  AND bc.Branch IN (@Branch)
  AND IsDeleted = 0
  AND IsCancelled = 0
  AND Data2 NOT LIKE 'NED_Clearance%';

INSERT INTO #FC1
SELECT B AS A
FROM #FC2;

DROP TABLE IF EXISTS #FC3;
SELECT SUM(A) AS Amount
INTO #FC3
FROM #FC1;

DROP TABLE IF EXISTS #PIA3;
SELECT *
INTO #PIA3
FROM (SELECT CONVERT(char(10), CAST(GETDATE() AS date), 126) AS Date,
             (SELECT CASE WHEN LEN(Code) = 3 THEN '0' + Code ELSE Code END AS Code
              FROM Custom_Test_TestCodes
              WHERE @Branch IN (Branch)) AS Code,
             '30100' AS Account,
             'E' AS VatCode,
             'Fit Cash to Treasury ' + CONVERT(varchar, @ReportDate, 103) AS Description,
             '' AS TransCode,
             'C' AS DC,
             Amount,
             'GL Movements' AS Category,
             'Fit Cash to ATM Recycling Account' AS Reason,
             (SELECT 'FCS ' + Branch FROM Custom_Test_TestCodes WHERE @Branch IN (Branch)) AS [Client Name],
             @Capturer AS Capturer
      FROM #FC3
      UNION ALL
      SELECT CONVERT(char(10), CAST(GETDATE() AS date), 126) AS Date,
             (SELECT CASE WHEN LEN(Code) = 3 THEN '0' + Code ELSE Code END AS Code
              FROM Custom_Test_TestCodes
              WHERE @Branch IN (Branch)) AS Code,
             '30150' AS Account,
             'E' AS VatCode,
             'Fit Cash to Treasury ' + CONVERT(varchar, @ReportDate, 103) AS Description,
             '' AS TransCode,
             'D' AS DC,
             Amount,
             'GL Movements' AS Category,
             'Fit Cash to ATM Recycling Account' AS Reason,
             (SELECT 'FCS ' + Branch FROM Custom_Test_TestCodes WHERE @Branch IN (Branch)) AS [Client Name],
             @Capturer AS Capturer
      FROM #FC3) a;

--******************************************************************************************--
SELECT DC,
       SUM(Amount) AS Totals
FROM (SELECT *
      FROM #PIA1
      UNION ALL
      SELECT Date,
             Code,
             Account,
             VatCode,
             Description,
             TransCode,
             DC,
             SUM(amount),
             Category,
             Reason,
             [Client Name],
             Capturer
      FROM #PIA2
      GROUP BY Date,
               Code,
               Account,
               VatCode,
               Description,
               TransCode,
               DC,
               Category,
               Reason,
               [Client Name],
               Capturer
      UNION ALL
      SELECT *
      FROM #PIA3
      WHERE Amount <> 0) a
GROUP BY DC;







--select dc, sum(amount) as Totals
--from #DCWC
--group by DC

**The issue I'm having is the following:

An expression of non-boolean type specified in a context where a condition is expected, near ','.



Solution 1:[1]

This bit is the problem:

WHERE @Branch IN (Branch)

You've got that 4 times in the #PIA3 query.

With a multi-valued param this will become Where 'one','two','three' IN (Branch) which is illegal sql. But with a single value you get 'one' IN (Branch) which will work.

SSRS does multi-valued parameters by using a 'trick' - instead of doing proper parameterised SQL, it just chucks the comma separated list of values into the SQL using string substitituion.

But that only works for Branch in (@Branch)

It wont work for @Branch in (Branch)

From what I can see of your query if you just swap them round it will be fine. @Branch always needs to be on the right hand side of an IN

Solution 2:[2]

This is not really an answer but too much for a comment...

As it stands, you have lots of subqueries that will return more than one value.

Focussing on the area where you insert into #PIA3 for now... Your 'Code' column will produce multiple rows and again with the [Client Name] column.

You will need to refactor each part I think. Without seeing your data it's difficult to understand but what you expect to se.

My guess would be... starting with #FC3, that contains 1 row and 1 column. Is that correct if you chose more than 1 branch? I suspect this would have to be split by branch. Working backwards from here #FC1 would also need to be split by branch.

So #FC1 would be created as follows

DROP TABLE IF EXISTS #FC1;
SELECT bc.Branch, SUM(cda.Amount) AS A
INTO #FC1
FROM ComparableData cda 
     JOIN ComparisonAccount ca ON cda.ComparisonAccountId = ca.Id
     JOIN ComparableDetail cde ON cda.ComparableDetailId = cde.id
     JOIN Custom_Test_TestCodes bc ON cde.Data1 = bc.Abbreviation
WHERE ComparisonAccountId = 1 --ISA
  AND Data55 = @ReportDate
  AND Data27 LIKE 'Deposit%'
  AND bc.Branch IN (@Branch)
  AND IsDeleted = 0
  AND IsCancelled = 0
  AND Data2 NOT LIKE 'NED_Clearance%'
GROUP BY bc.Branch;

A similar change would be required for #FC2 and #FC3

Now that #FC3 has a brand column you can do a simple join to your Custom_Test_TestCodes table.

Here's my guess as to what the first part of the code that builds #PIA3 shoudl look like

...
...
DROP TABLE IF EXISTS #PIA3;
SELECT *
INTO #PIA3
FROM (SELECT 
            CONVERT(char(10), CAST(GETDATE() AS date), 126) AS Date,
            CASE WHEN LEN(ctc.Code) = 3 THEN '0' + ctc.Code ELSE ctc.Code END AS Code,
             '30100' AS Account,
             'E' AS VatCode,
             'Fit Cash to Treasury ' + CONVERT(varchar, @ReportDate, 103) AS Description,
             '' AS TransCode,
             'C' AS DC,
             Amount,
             'GL Movements' AS Category,
             'Fit Cash to ATM Recycling Account' AS Reason,
             'FCS ' + ctc.Branch AS [Client Name],
             @Capturer AS Capturer
      FROM #FC3 f 
        JOIN Custom_Test_TestCodes ctc ON f.Branch = ctc.Branch 
      UNION ALL
      ...
      ...

There's a lot of assumptions here so it may not be what you want but it shoudl give you an idea as to the issues an possible solutions.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Alan Schofield