@Erland Sommarskog here is the actual sproc and xml plans xml with issues.xml xml without issues.xml
CREATE PROCEDURE [Query].[sp003PaSoGetSalesOrders]
@FiltersJSON NVARCHAR(MAX) = NULL,
@PageSize INT = 50,
@PageNumber INT = 1,
@SortColumns NVARCHAR(MAX) = NULL,
@IncludeCompleted BIT = 0
AS
BEGIN
SET NOCOUNT ON;
DECLARE @RowStart INT = (@PageNumber - 1) * @PageSize;
DECLARE @ParsedSearchQueries NVARCHAR(MAX) = '';
DECLARE @SortSQL NVARCHAR(MAX) = 'OrderDate DESC';
DECLARE @UserUPN VARCHAR(4000) = ORIGINAL_LOGIN();
DECLARE @sql NVARCHAR(MAX);
DECLARE @IsDraftShow BIT = 0
CREATE TABLE #SalesOrders
(
SalesOrderId INT,
StrategixSoId VARCHAR(100),
DocId VARCHAR(50),
OrderDate DATETIME,
action_date DATETIME,
MidwichCompanyName NVARCHAR(200),
CustomerName NVARCHAR(200),
CustomerID NVARCHAR(100),
ReqDeliveryDate DATETIME,
due_date_type VARCHAR(20),
OrderStatus NVARCHAR(100),
stop_status NVARCHAR(100),
OutstandingRevenue DECIMAL(18,2),
OrderNotes NVARCHAR(MAX),
AssignedTo NVARCHAR(200),
assigned_to_email NVARCHAR(200),
PurchaseOrderID NVARCHAR(100),
SalesManager NVARCHAR(200),
OrderType NVARCHAR(100),
TotalSaleValue DECIMAL(18,2),
TotalCount INT
);
BEGIN TRY
------------------------------------------------------------------
-- Build WHERE clause (supports dynamic group AND/OR logic)
------------------------------------------------------------------
IF @FiltersJSON IS NOT NULL AND LTRIM(RTRIM(@FiltersJSON)) <> '[]'
BEGIN
DECLARE @FilterTable TABLE (
[group] NVARCHAR(50),
[group_logic] NVARCHAR(5),
[key] NVARCHAR(200),
[operator] NVARCHAR(10),
[value] NVARCHAR(MAX)
);
INSERT INTO @FilterTable ([group], [group_logic], [key], [operator], [value])
SELECT
[group],
ISNULL([group_logic], 'AND'),
[key],
[operator],
[value]
FROM OPENJSON(@FiltersJSON)
WITH (
[group] NVARCHAR(50),
[group_logic] NVARCHAR(5),
[key] NVARCHAR(200),
[operator] NVARCHAR(10),
[value] NVARCHAR(MAX)
);
DECLARE @GroupFilters TABLE ([group] NVARCHAR(50), GroupedFilter NVARCHAR(MAX));
DECLARE @CurrentGroup NVARCHAR(50), @GroupLogic NVARCHAR(5), @Filter NVARCHAR(MAX), @Sep NVARCHAR(10);
DECLARE group_cursor CURSOR FOR
SELECT DISTINCT [group] FROM @FilterTable;
OPEN group_cursor;
FETCH NEXT FROM group_cursor INTO @CurrentGroup;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT TOP 1 @GroupLogic = [group_logic] FROM @FilterTable WHERE [group] = @CurrentGroup;
SET @Sep = CASE WHEN @GroupLogic = 'OR' THEN ' OR ' ELSE ' AND ' END;
SELECT @Filter = '(' + ISNULL((
SELECT STRING_AGG(
[key] + ' ' + [operator] + ' ' +
CASE
WHEN [operator] = 'LIKE' THEN '''%' + REPLACE([value], '''', '''''') + '%'''
WHEN ISNUMERIC([value]) = 1 THEN [value]
ELSE '''' + REPLACE([value], '''', '''''') + ''''
END,
@Sep
)
FROM @FilterTable f
WHERE f.[group] = t.[group]
), '') + ')'
FROM (SELECT TOP 1 [group] FROM @FilterTable WHERE [group] = @CurrentGroup) t;
IF LEN(ISNULL(@Filter, '')) > 2
INSERT INTO @GroupFilters VALUES (@CurrentGroup, @Filter);
FETCH NEXT FROM group_cursor INTO @CurrentGroup;
END
CLOSE group_cursor;
DEALLOCATE group_cursor;
-- Combine all groups with AND (could make this dynamic later)
SELECT @ParsedSearchQueries = STRING_AGG(GroupedFilter, ' AND ')
FROM @GroupFilters;
END
If Exists (Select 1 from @FilterTable where [key] = 'SOH_STATUS' and [value] = 'Draft')
Select @IsDraftShow = 1
------------------------------------------------------------------
-- Build ORDER BY clause
------------------------------------------------------------------
IF @SortColumns IS NOT NULL
BEGIN
SELECT @SortSQL = STRING_AGG(
[key] + ' ' +
CASE WHEN [value] IN ('ASC', 'DESC') THEN [value] ELSE 'ASC' END,
', '
)
FROM OPENJSON(@SortColumns)
WITH ([key] NVARCHAR(200), [value] NVARCHAR(10));
END
------------------------------------------------------------------
-- Build dynamic SQL for data
------------------------------------------------------------------
SET @sql = '
WITH InternalLineItemTotals AS (
SELECT
soi.sales_order_id,
SUM(soi.product_cost * soi.quantity) AS TotalSaleValue
FROM [Confidential].[vwPaSalesOrderLineItems] soi
GROUP BY sales_order_id
),
StxLineItemTotals AS (
SELECT
soi.SOI_ORDREF,
SUM(soi.SOI_PRICE * soi.SOI_ITQTY) AS TotalSaleValue
FROM [Confidential].[vwStxSOITEM] soi
GROUP BY SOI_ORDREF
),
FilteredData AS (
SELECT
saa.sales_order_id AS SalesOrderId,
SOH_ORDREF AS StrategixSoId,
OlpEmail_DocId AS DocId,
SOH_ORDDATETIME AS OrderDate,
action_date,
SOH_COMPANY AS MidwichCompanyName,
NDM.NDM_NAME AS CustomerName,
SOH_ACCOUNT AS CustomerID,
SOH_REQDATE AS ReqDeliveryDate,
due_date_type,
SOH_STATUS AS OrderStatus,
SOH_STOPCODE AS stop_status,
SOH_ORDVAL AS OutstandingRevenue,
order_notes AS OrderNotes,
AssignedTo,
assigned_to_email,
SOH_CUSREF AS PurchaseOrderID,
STXUSR.US_NAME AS SalesManager,
OrderType AS OrderType,
COALESCE(slit.TotalSaleValue, ilit.TotalSaleValue, 0) AS TotalSaleValue
FROM [Enterprise].[vwPaSalesOrdersAll] saa
LEFT JOIN [Confidential].[vwStxDLCUST] CUST ON saa.SOH_ACCOUNT = CUST.DLCUS_CUSTOMER
LEFT JOIN [Confidential].[vwStxUSERS] STXUSR ON CUST.DLCUS_REP = STXUSR.US_COID
LEFT JOIN [Confidential].[vwStxNDMAS] NDM ON saa.SOH_ACCOUNT = NDM.NDM_NDCODE
LEFT JOIN InternalLineItemTotals ilit ON saa.sales_order_id = ilit.sales_order_id
LEFT JOIN StxLineItemTotals slit ON saa.SOH_ORDREF = slit.SOI_ORDREF
' +
CASE
WHEN @ParsedSearchQueries = '' THEN
'WHERE (' + CASE WHEN @IncludeCompleted = 1 THEN '1=1' ELSE 'ISNULL(SOH_STATUS,'''') not in (''Complete'',''Draft'')' END + ')'
ELSE
'WHERE (' + @ParsedSearchQueries + ') AND (' + CASE WHEN @IncludeCompleted = 1 THEN '1=1' ELSE CASE WHEN @IsDraftShow = 1 THEN 'ISNULL(SOH_STATUS,'''') <> ''Complete'''
ELSE 'ISNULL(SOH_STATUS,'''') not in (''Complete'',''Draft'')' END
END + ')'
END
+ '
),
Counted AS (
SELECT *, (SELECT COUNT(1) FROM FilteredData) AS TotalCount
FROM FilteredData
)
SELECT *
FROM Counted
ORDER BY ' + @SortSQL;
IF @PageSize > 0
SET @sql += '
OFFSET ' + CAST(@RowStart AS VARCHAR) + ' ROWS
FETCH NEXT ' + CAST(@PageSize AS VARCHAR) + ' ROWS ONLY';
SET @sql += ' OPTION (RECOMPILE);';
----------------------------------------------------------------
-- Execute dynamic SQL and capture paginated results
----------------------------------------------------------------
INSERT INTO #SalesOrders
EXEC sp_executesql @sql;
------------------------------------------------------------------
-- Return data and total
------------------------------------------------------------------
DECLARE @FinalSQL NVARCHAR(MAX);
SET @FinalSQL = '
SELECT *
FROM #SalesOrders
ORDER BY ' + @SortSQL;
EXEC sp_executesql @FinalSQL;
SELECT TOP 1 TotalCount FROM #SalesOrders;
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
DECLARE @ErrorState INT = ERROR_STATE();
DECLARE @ErrorNumber INT = ERROR_NUMBER();
DECLARE @ErrorProcedure NVARCHAR(200) = ERROR_PROCEDURE();
DECLARE @ErrorLine INT = ERROR_LINE();
DECLARE @FullErrorMessage NVARCHAR(MAX) = CONCAT(
'Error ', @ErrorNumber,
' Severity ', @ErrorSeverity,
' State ', @ErrorState,
' Occurred in ', COALESCE(@ErrorProcedure, 'unknown'),
' at line ', @ErrorLine, ': ', @ErrorMessage
);
EXEC [Log].[spInsertLogError] @UPN = @UserUPN, @Detail = @FullErrorMessage;
THROW;
END CATCH
END
GO