1

Ist es möglich, If Else Inside-Tabellenwertfunktion zu verwenden. Ich habe eine Skalarfunktion, wo ich If Else Condition verwende, aber diese Abfrage dauert zu lange, um sie als Inline-Tabellenwertfunktion zu konvertieren. bitte schlagen sie mir vor, wie ich das machen kann.IF Else innerhalb von Inline-Tabellenwerten

ALTER FUNCTION [dbo].[TestFunctionFindSum] 
( 
@ProductID bigint, 
@TotalType nvarchar(200), 
@OwnerUserID bigint, 
@OrganizationID bigint, 
@BusinessUnitID bigint, 
@InventoryID bigint 
) 
RETURNS decimal(32,9) 
AS 
BEGIN 
-- declare the return variable here 
declare @OutputValue decimal(32,9) 
Declare @locationValue int =0 

--------------------------------------------------------------------- 
-- Getting Inventory Items Total as per the Total Type supplied 
--------------------------------------------------------------------- 

IF @TotalType = 'QuantityOnHand'  
BEGIN 
    set @OutputValue = isnull((select sum(ii.[QuantityOnHand]) 
      from dbo.InventoryItems ii, Inventory i    
      where ii.ActiveStatus=1 
      and ii.ProductID = @ProductID 
      and ii.InventoryID = i.InventoryID 
     AND i.OwnerUserGroupID = case @OwnerUserID 
     when 0 then i.OwnerUserGroupID else @OwnerUserID end 
     AND i.OrganizationID = case @OrganizationID 
     when 0 then i.OrganizationID else @OrganizationID end 
     AND i.BusinessUnitID = case @BusinessUnitID 
     when 0 then i.BusinessUnitID else @BusinessUnitID end 
     AND i.InventoryID = case @InventoryID 
     when 0 then i.InventoryID else @InventoryID end), 0.00) 
END 
ELSE IF @TotalType = 'QuantityBooked' 
    BEGIN 
    set @OutputValue = isnull((select sum(ii.QuantitySold) 
      from dbo.InventoryItems ii, Inventory i    
      where ii.ActiveStatus=1 
      and ii.ProductID = @ProductID 
      and ii.InventoryID = i.InventoryID 
     AND i.OwnerUserGroupID = case @OwnerUserID 
     when 0 then i.OwnerUserGroupID else @OwnerUserID end 
     AND i.OrganizationID = case @OrganizationID 
     when 0 then i.OrganizationID else @OrganizationID end 
     AND i.BusinessUnitID = case @BusinessUnitID 
     when 0 then i.BusinessUnitID else @BusinessUnitID end 
     AND i.InventoryID = case @InventoryID 
     when 0 then i.InventoryID else @InventoryID end), 0.00) 
END 
ELSE IF @TotalType = 'ProjectedQuantityOnHand' 
    BEGIN 
    set @OutputValue = isnull((select (sum(ii.QuantityOnHand) - sum(ii.QuantitySold)) 
      from dbo.InventoryItems ii, Inventory i    
      where ii.ActiveStatus=1 
      and ii.ProductID = @ProductID 
      and ii.InventoryID = i.InventoryID 
     AND i.OwnerUserGroupID = case @OwnerUserID 
     when 0 then i.OwnerUserGroupID else @OwnerUserID end 
     AND i.OrganizationID = case @OrganizationID 
     when 0 then i.OrganizationID else @OrganizationID end 
     AND i.BusinessUnitID = case @BusinessUnitID 
     when 0 then i.BusinessUnitID else @BusinessUnitID end 
     AND i.InventoryID = case @InventoryID 
     when 0 then i.InventoryID else @InventoryID end), 0.00) 
END 
return @OutputValue 

END 

oben ist meine skalare Funktion .. eine Idee, wie Sie den Datensatz basierend auf Inline-Tabellenwertfunktion finden.

Was ich

CREATE FUNCTION [dbo].[TestFunctionFindSum](@ProductID bigint, 
@TotalType nvarchar(200), 
@OwnerUserID bigint, 
@OrganizationID bigint, 
@BusinessUnitID bigint, 
@InventoryID bigint ) 
RETURNS TABLE 
AS RETURN 
IF @TotalType = 'QuantityOnHand'  
BEGIN 
    isnull((select sum(ii.[QuantityOnHand]) 
      from dbo.InventoryItems ii, Inventory i    
      where ii.ActiveStatus=1 
      and ii.ProductID = @ProductID 
      and ii.InventoryID = i.InventoryID 
     AND i.OwnerUserGroupID = case @OwnerUserID 
     when 0 then i.OwnerUserGroupID else @OwnerUserID end 
     AND i.OrganizationID = case @OrganizationID 
     when 0 then i.OrganizationID else @OrganizationID end 
     AND i.BusinessUnitID = case @BusinessUnitID 
     when 0 then i.BusinessUnitID else @BusinessUnitID end 
     AND i.InventoryID = case @InventoryID 
     when 0 then i.InventoryID else @InventoryID end), 0.00) 
END 
GO 
+0

Nein, Sie können nicht verwenden, wenn, weil Sie nur eine Anweisung haben. Sie müssen eine Case-Anweisung in Ihrer SELECT-Klausel haben, um die richtige Summe auszuwählen, vielleicht mit einer abgeleiteten Tabelle oder einem CTE, um es klarer zu machen. –

Antwort

1

versuchen, können Sie CASE-Anweisung verwenden, wie

CREATE FUNCTION [dbo].[TestFunctionFindSum](@ProductID bigint, 
@TotalType nvarchar(200), 
@OwnerUserID bigint, 
@OrganizationID bigint, 
@BusinessUnitID bigint, 
@InventoryID bigint ) 
RETURNS TABLE 
AS RETURN 
SELECT 
    CASE WHEN @TotalType = 'QuantityOnHand' THEN 
       isnull((select sum(ii.[QuantityOnHand]) 
         from dbo.InventoryItems ii, Inventory i    
         where ii.ActiveStatus=1 
         and ii.ProductID = @ProductID 
         and ii.InventoryID = i.InventoryID 
         AND i.OwnerUserGroupID = case @OwnerUserID 
         when 0 then i.OwnerUserGroupID else @OwnerUserID end 
         AND i.OrganizationID = case @OrganizationID 
         when 0 then i.OrganizationID else @OrganizationID end 
         AND i.BusinessUnitID = case @BusinessUnitID 
         when 0 then i.BusinessUnitID else @BusinessUnitID end 
         AND i.InventoryID = case @InventoryID 
         when 0 then i.InventoryID else @InventoryID end), 0.00) 
     WHEN @TotalType = 'QuantityBooked' THEN 
       isnull((select sum(ii.QuantitySold) 
         from dbo.InventoryItems ii, Inventory i    
         where ii.ActiveStatus=1 
         and ii.ProductID = @ProductID 
         and ii.InventoryID = i.InventoryID 
         AND i.OwnerUserGroupID = case @OwnerUserID 
         when 0 then i.OwnerUserGroupID else @OwnerUserID end 
         AND i.OrganizationID = case @OrganizationID 
         when 0 then i.OrganizationID else @OrganizationID end 
         AND i.BusinessUnitID = case @BusinessUnitID 
         when 0 then i.BusinessUnitID else @BusinessUnitID end 
         AND i.InventoryID = case @InventoryID 
         when 0 then i.InventoryID else @InventoryID end), 0.00) 
     WHEN @TotalType = 'ProjectedQuantityOnHand' THEN 
       isnull((select (sum(ii.QuantityOnHand) - sum(ii.QuantitySold)) 
         from dbo.InventoryItems ii, Inventory i    
         where ii.ActiveStatus=1 
         and ii.ProductID = @ProductID 
         and ii.InventoryID = i.InventoryID 
         AND i.OwnerUserGroupID = case @OwnerUserID 
         when 0 then i.OwnerUserGroupID else @OwnerUserID end 
         AND i.OrganizationID = case @OrganizationID 
         when 0 then i.OrganizationID else @OrganizationID end 
         AND i.BusinessUnitID = case @BusinessUnitID 
         when 0 then i.BusinessUnitID else @BusinessUnitID end 
         AND i.InventoryID = case @InventoryID 
         when 0 then i.InventoryID else @InventoryID end), 0.00) 
     END AS OutputValue 
GO