From 250323f8b082877c3c7d4dcdeccb46b2660ece4f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 6 Jan 2026 13:14:18 -0500 Subject: [PATCH] feat(db): add inline TVFs for simple array extraction from SearchCriteria --- .../046_CreateSimpleTableFunctions.sql | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 NEW/src/JdeScoping.Database/Scripts/046_CreateSimpleTableFunctions.sql diff --git a/NEW/src/JdeScoping.Database/Scripts/046_CreateSimpleTableFunctions.sql b/NEW/src/JdeScoping.Database/Scripts/046_CreateSimpleTableFunctions.sql new file mode 100644 index 0000000..17224d9 --- /dev/null +++ b/NEW/src/JdeScoping.Database/Scripts/046_CreateSimpleTableFunctions.sql @@ -0,0 +1,128 @@ +-- Migration: 046_CreateSimpleTableFunctions +-- Inline TVFs to extract simple arrays from Search.Criteria JSON +-- Pattern: CTE pre-filters valid JSON, OPENJSON...WITH for type-safe extraction + +-- fn_GetSearchWorkOrders: Extract WorkOrderNumbers array +IF OBJECT_ID('dbo.fn_GetSearchWorkOrders', 'IF') IS NOT NULL + DROP FUNCTION dbo.fn_GetSearchWorkOrders; +GO + +CREATE FUNCTION dbo.fn_GetSearchWorkOrders(@SearchId INT) +RETURNS TABLE +AS +RETURN +( + WITH ValidSearch AS ( + SELECT Criteria + FROM dbo.Search + WHERE ID = @SearchId + AND Criteria IS NOT NULL + AND ISJSON(Criteria) = 1 + ) + SELECT j.WorkOrderNumber + FROM ValidSearch s + CROSS APPLY OPENJSON(s.Criteria, '$.WorkOrderNumbers') + WITH (WorkOrderNumber BIGINT '$') j + WHERE j.WorkOrderNumber IS NOT NULL +); +GO + +-- fn_GetSearchItemNumbers: Extract ItemNumbers array +IF OBJECT_ID('dbo.fn_GetSearchItemNumbers', 'IF') IS NOT NULL + DROP FUNCTION dbo.fn_GetSearchItemNumbers; +GO + +CREATE FUNCTION dbo.fn_GetSearchItemNumbers(@SearchId INT) +RETURNS TABLE +AS +RETURN +( + WITH ValidSearch AS ( + SELECT Criteria + FROM dbo.Search + WHERE ID = @SearchId + AND Criteria IS NOT NULL + AND ISJSON(Criteria) = 1 + ) + SELECT j.ItemNumber + FROM ValidSearch s + CROSS APPLY OPENJSON(s.Criteria, '$.ItemNumbers') + WITH (ItemNumber VARCHAR(128) '$') j + WHERE j.ItemNumber IS NOT NULL +); +GO + +-- fn_GetSearchProfitCenters: Extract ProfitCenters array +IF OBJECT_ID('dbo.fn_GetSearchProfitCenters', 'IF') IS NOT NULL + DROP FUNCTION dbo.fn_GetSearchProfitCenters; +GO + +CREATE FUNCTION dbo.fn_GetSearchProfitCenters(@SearchId INT) +RETURNS TABLE +AS +RETURN +( + WITH ValidSearch AS ( + SELECT Criteria + FROM dbo.Search + WHERE ID = @SearchId + AND Criteria IS NOT NULL + AND ISJSON(Criteria) = 1 + ) + SELECT j.Code + FROM ValidSearch s + CROSS APPLY OPENJSON(s.Criteria, '$.ProfitCenters') + WITH (Code VARCHAR(12) '$') j + WHERE j.Code IS NOT NULL +); +GO + +-- fn_GetSearchWorkCenters: Extract WorkCenters array +IF OBJECT_ID('dbo.fn_GetSearchWorkCenters', 'IF') IS NOT NULL + DROP FUNCTION dbo.fn_GetSearchWorkCenters; +GO + +CREATE FUNCTION dbo.fn_GetSearchWorkCenters(@SearchId INT) +RETURNS TABLE +AS +RETURN +( + WITH ValidSearch AS ( + SELECT Criteria + FROM dbo.Search + WHERE ID = @SearchId + AND Criteria IS NOT NULL + AND ISJSON(Criteria) = 1 + ) + SELECT j.Code + FROM ValidSearch s + CROSS APPLY OPENJSON(s.Criteria, '$.WorkCenters') + WITH (Code VARCHAR(12) '$') j + WHERE j.Code IS NOT NULL +); +GO + +-- fn_GetSearchOperatorIDs: Extract OperatorIDs array +IF OBJECT_ID('dbo.fn_GetSearchOperatorIDs', 'IF') IS NOT NULL + DROP FUNCTION dbo.fn_GetSearchOperatorIDs; +GO + +CREATE FUNCTION dbo.fn_GetSearchOperatorIDs(@SearchId INT) +RETURNS TABLE +AS +RETURN +( + WITH ValidSearch AS ( + SELECT Criteria + FROM dbo.Search + WHERE ID = @SearchId + AND Criteria IS NOT NULL + AND ISJSON(Criteria) = 1 + ) + SELECT j.OperatorID + FROM ValidSearch s + CROSS APPLY OPENJSON(s.Criteria, '$.OperatorIDs') + WITH (OperatorID VARCHAR(128) '$') j + WHERE j.OperatorID IS NOT NULL +); +GO