获取存储过程中使用的连接数

Get count of Joins used in stored procedure

CREATE PROCEDURE [dbo].[uspGetBillOfMaterials]
@StartProductID [int],
@CheckDate [datetime] AS BEGIN

WITH [BOM_cte]([ProductAssemblyID], [ComponentID], [ComponentDesc], [PerAssemblyQty], [StandardCost], [ListPrice], [BOMLevel], [RecursionLevel]) -- CTE name and columns
AS (
    SELECT b.[ProductAssemblyID], b.[ComponentID], p.[Name], b.[PerAssemblyQty], p.[StandardCost], p.[ListPrice], b.[BOMLevel], 0 -- Get the initial list of components for the bike assembly
    FROM [Production].[BillOfMaterials] b
        INNER JOIN [Production].[Product] p 
        ON b.[ComponentID] = p.[ProductID] 
    WHERE b.[ProductAssemblyID] = @StartProductID 
        AND @CheckDate >= b.[StartDate] 
        AND @CheckDate <= ISNULL(b.[EndDate], @CheckDate)
    UNION ALL
    SELECT b.[ProductAssemblyID], b.[ComponentID], p.[Name], b.[PerAssemblyQty], p.[StandardCost], p.[ListPrice], b.[BOMLevel], [RecursionLevel] + 1 -- Join recursive member to anchor
    FROM [BOM_cte] cte
        INNER JOIN [Production].[BillOfMaterials] b 
        ON b.[ProductAssemblyID] = cte.[ComponentID]
        INNER JOIN [Production].[Product] p 
        ON b.[ComponentID] = p.[ProductID] 
    WHERE @CheckDate >= b.[StartDate] 
        AND @CheckDate <= ISNULL(b.[EndDate], @CheckDate)
    )
-- Outer select from the CTE
SELECT b.[ProductAssemblyID], b.[ComponentID], b.[ComponentDesc], SUM(b.[PerAssemblyQty]) AS [TotalQuantity] , b.[StandardCost], b.[ListPrice], b.[BOMLevel], b.[RecursionLevel]
FROM [BOM_cte] b
GROUP BY b.[ComponentID], b.[ComponentDesc], b.[ProductAssemblyID], b.[BOMLevel], b.[RecursionLevel], b.[StandardCost], b.[ListPrice]
ORDER BY b.[BOMLevel], b.[ProductAssemblyID], b.[ComponentID] END;

我想获取存储过程查询批次中使用的连接计数。我需要验证批连接计数是否不超过 4。

这样试试,

DECLARE @String NVARCHAR(4000) = 
    'CREATE PROCEDURE [dbo].[uspGetBillOfMaterials]
@StartProductID [int],
@CheckDate [datetime] AS BEGIN

WITH [BOM_cte]([ProductAssemblyID], [ComponentID], [ComponentDesc], [PerAssemblyQty], [StandardCost], [ListPrice], [BOMLevel], [RecursionLevel]) -- CTE name and columns
AS (
    SELECT b.[ProductAssemblyID], b.[ComponentID], p.[Name], b.[PerAssemblyQty], p.[StandardCost], p.[ListPrice], b.[BOMLevel], 0 -- Get the initial list of components for the bike assembly
    FROM [Production].[BillOfMaterials] b
        INNER JOIN [Production].[Product] p 
        ON b.[ComponentID] = p.[ProductID] 
    WHERE b.[ProductAssemblyID] = @StartProductID 
        AND @CheckDate >= b.[StartDate] 
        AND @CheckDate <= ISNULL(b.[EndDate], @CheckDate)
    UNION ALL
    SELECT b.[ProductAssemblyID], b.[ComponentID], p.[Name], b.[PerAssemblyQty], p.[StandardCost], p.[ListPrice], b.[BOMLevel], [RecursionLevel] + 1 -- Join recursive member to anchor
    FROM [BOM_cte] cte
        INNER JOIN [Production].[BillOfMaterials] b 
        ON b.[ProductAssemblyID] = cte.[ComponentID]
        INNER JOIN [Production].[Product] p 
        ON b.[ComponentID] = p.[ProductID] 
    WHERE @CheckDate >= b.[StartDate] 
        AND @CheckDate <= ISNULL(b.[EndDate], @CheckDate)
    )
-- Outer select from the CTE
SELECT b.[ProductAssemblyID], b.[ComponentID], b.[ComponentDesc], SUM(b.[PerAssemblyQty]) AS [TotalQuantity] , b.[StandardCost], b.[ListPrice], b.[BOMLevel], b.[RecursionLevel]
FROM [BOM_cte] b
GROUP BY b.[ComponentID], b.[ComponentDesc], b.[ProductAssemblyID], b.[BOMLevel], b.[RecursionLevel], b.[StandardCost], b.[ListPrice]
ORDER BY b.[BOMLevel], b.[ProductAssemblyID], b.[ComponentID] END;'
    ,@SubString VARCHAR(255) = 'JOIN'

SELECT (LEN(@String)-LEN(REPLACE(@String, @SubString, '')))/LEN(@SubString) as count