feat(db): add inline TVFs for simple array extraction from SearchCriteria
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user