Ist es möglich, aus dieser skalaren function eine Inline-Tabellenwertfunktion zu erstellen?

Ich bin mir ziemlich sicher, dass die Antwort nein ist, aber ich möchte doppelt überprüfen. Wenn es einen path gibt, musst du es nicht wirklich kodieren, ein Vorschlag auf einer Methode könnte helfen. Ich habe versucht 1 große Select mit Sub-Abfrage, etc. aber ich kann nicht herausfinden, wie man es bekommen, um die richtige Aufzeichnung zu wählen.

Der Tisch muss sich selbst anschließen, um umgekehrte Beziehungen zu bekommen. Der untenstehende Code ist nur ein Testmuster.

Vielen Dank

create function [dbo].[fnUOMFactor_Inline] ( @ItemID nvarchar(20) , @FromUnit nvarchar(10) , @ToUnit nvarchar(10) ) returns numeric(28,12) as begin declare @Factor numeric(28,12) if @FromUnit = @ToUnit set @Factor = 1 -- Simple 1-step if @Factor is null select @Factor = factor from dbo.UnitConvertTest WHere itemid = @ItemID and fromunit = @FromUnit and tounit = @ToUnit -- Inverted 1-step if @Factor is null select @Factor = 1/factor from dbo.UnitConvertTest Where itemid = @ItemID and fromunit = @ToUnit and tounit = @FromUnit if @Factor is null select @Factor = uc1.factor * uc2.factor from dbo.UnitConvertTest uc1 join dbo.UnitConvertTest uc2 on uc1.itemid = uc2.itemid and uc1.tounit = uc2.fromunit where uc1.itemid = @ItemID and uc1.fromunit = @FromUnit and uc2.tounit = @ToUnit and uc1.factor <> 0 and uc2.factor <> 0 -- Inverted 2-step if @Factor is null select @Factor = 1 / (uc1.factor * uc2.factor) from dbo.UnitConvertTest uc1 join dbo.UnitConvertTest uc2 on uc1.itemid = uc2.itemid and uc1.tounit = uc2.fromunit Where uc1.itemid = @ItemID and uc1.fromunit = @ToUnit and uc2.tounit = @FromUnit -- Complex 2-step (same fromunit) if @Factor is null select @Factor = uc1.factor / uc2.factor from dbo.UnitConvertTest uc1 join dbo.UnitConvertTest uc2 on uc1.itemid = uc2.itemid and uc1.fromunit = uc2.fromunit Where uc1.itemid = @ItemID and uc1.tounit = @ToUnit and uc2.tounit = @FromUnit -- Complex 2-step (same tounit) if @Factor is null select @Factor = uc1.factor / uc2.factor from dbo.UnitConvertTest uc1 join dbo.UnitConvertTest uc2 on uc1.itemid = uc2.itemid and uc1.tounit = uc2.tounit Where uc1.itemid = @ItemID and uc1.fromunit = @FromUnit and uc2.fromunit = @ToUnit -- Default if @Factor is null set @Factor = 1 return @Factor end 

Dies ist eine Tabelle mit einigen datasätzen zum Testen.

 CREATE TABLE [dbo].[UnitConvertTest]( [FROMUNIT] [nvarchar](10) NOT NULL, [TOUNIT] [nvarchar](10) NOT NULL, [FACTOR] [numeric](28,12) NOT NULL, [ITEMID] [nvarchar](20) NOT NULL, ) ON [PRIMARY] insert into dbo.UnitConvertTest (FROMUNIT, TOUNIT, FACTOR, ITEMID) Values ('CT','PT','40.00','TEST') , ('RM','CT','10.00','TEST') , ('RM','PT','400.00','TEST') Select [dbo].[fnUOMFactor_Inline] ('Test','PT','RM') 

Jede schlaufenfreie Skalarfunktion kann durch mechanische Transformationen zu einem Inline-TVP verwandelt werden. Die Transformationen könnten jedoch zu einer großen Abfrage führen.

Dein Code scheint eine Kette von Fallback-Berechnungen zu sein. Sie können es so schreiben:

 select FinalResult = coalesce(x.factor, f1.fallback, f2.fallback, f3.fallback, ...) from (values (convert(decimal(28, 12, null))) x(factor) cross apply (select fallback = {computeFallback1}) f1 cross apply (select fallback = {computeFallback2}) f2 cross apply (select fallback = {computeFallback3}) f3 ... 

Im Wesentlichen handelt es sich hierbei um eine Reihe von Skalar-Berechnungen durch eine einreihige Tabelle, die wir kontinuierlich Spalten hinzufügen …

Dies könnte zu einer Abfrage mit performancesproblemen führen. Es wird wahrscheinlich loop verbindet.