Auf der search nach einer allgemeinen "Minimum" Benutzerdefinierten function

Ich habe die folgende function erstellt, um ein Stück besonders komplexen Code zu vereinfachen.

CREATE FUNCTION [dbo].[DSGetMinimumInt] (@First INT, @Second INT) RETURNS INT AS BEGIN IF @First < @Second RETURN @First RETURN @Second END 

Allerdings funktioniert es nur für den INT-datatyp. Ich weiß, ich könnte eine für numerische und möglicherweise für Varchar und Datetime erstellen.

Ist es möglich, einen Master "Minimum" -function zu erstellen, um mit ihnen alle umzugehen? Hat jemand das getan

Ich habe es gegoogelt, aber komm leer

hier ist eine grundlegende, mit der du arbeiten kannst, ich würde es vorsichtig sein, dies in Abfragen zu verwenden, da es sie im Verhältnis zu der Anzahl der Zeilen, die sie verwendet wird, verlangsamen wird:

 CREATE FUNCTION [dbo].[DSGetMinimum] (@First sql_variant, @Second sql_variant) RETURNS varchar(8000) AS BEGIN DECLARE @Value varchar(8000) IF SQL_VARIANT_PROPERTY(@First,'BaseType')=SQL_VARIANT_PROPERTY(@Second,'BaseType') OR @First IS NULL OR @Second IS NULL BEGIN IF SQL_VARIANT_PROPERTY(@First,'BaseType')='datetime' BEGIN IF CONVERT(datetime,@First)<CONVERT(datetime,@Second) BEGIN SET @Value=CONVERT(char(23),@First,121) END ELSE BEGIN SET @Value=CONVERT(char(23),@Second,121) END END --IF datetime ELSE BEGIN IF @First < @Second SET @Value=CONVERT(varchar(8000),@First) ELSE SET @Value=CONVERT(varchar(8000),@Second) END END --IF types the same RETURN @Value END GO 

BEARBEITEN
Testcode:

 DECLARE @D1 datetime , @D2 datetime DECLARE @I1 int , @I2 int DECLARE @V1 varchar(5) , @V2 varchar(5) SELECT @D1='1/1/2010', @D2='1/2/2010' ,@I1=5 , @I2=999 ,@V1='abc' , @V2='xyz' PRINT dbo.DSGetMinimumInt(@D1,@D2) PRINT dbo.DSGetMinimumInt(@I1,@I2) PRINT dbo.DSGetMinimumInt(@V1,@V2) 

Testausgang:

 2010-01-01 00:00:00.000 5 abc 

Wenn du das in einer Abfrage verwenden wirst, würde ich einfach eine Inline-CASE-statement verwenden, die viel schneller als die UDF wäre:

 CASE WHEN @valueAnyType1<@ValueAnyType2 THEN @valueAnyType1 ELSE @ValueAnyType2 END 

Sie können bei NULL, falls nötig, Schutz hinzufügen:

 CASE WHEN @valueAnyType1<=ISNULL(@ValueAnyType2,@valueAnyType1) THEN @valueAnyType1 ELSE @ValueAnyType2 END 

Alle wichtigen databaseen außer SQL server unterstützen LEAST und GREATEST , die was du willst.

In SQL server kannst du es so emulieren:

 WITH q (col1, col2) AS ( SELECT 'test1', 'test2' UNION ALL SELECT 'test3', 'test4' ) SELECT ( SELECT MIN(col) FROM ( SELECT col1 AS col UNION ALL SELECT col2 ) qa ) FROM q 

, obwohl es ein bisschen weniger effizient sein wird als ein UDF .