2010-02-18 45 views
0

我創建了以下函數來簡化一段特別複雜的代碼。尋找一般「最小」用戶定義函數

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

END 

但是,它只適用於INT數據類型。我知道我可以創建一個數字和可能爲Varchar和日期時間。

是否有可能創建一個主「最小」功能來處理它們?有沒有人做過這個?

我已經Google了它,但空了。

回答

1

這裏是一個基本的,你可以工作,我會小心在查詢中使用這個,因爲它會按比例它們放慢它在使用的行數:

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 

編輯
測試代碼:

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) 

測試輸出:

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

如果您打算在查詢中使用此,我只想用一個內嵌CASE語句,這將是非常快則UDF:

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

您可以添加必要的保護爲NULL:

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

謝謝。此代碼是否可以在SQL 2000中工作? – DavidStein 2010-02-18 16:25:27

+0

@David Stein,如果你使用SQL 2000,你應該添加(不改變)一個標籤到問題:「sql-server-2000」。我認爲這個函數會起作用,我沒有SQL 2000來測試它。 CASE聲明將起作用。 – 2010-02-18 16:41:14

1

SQL Server支持LEASTGREATEST之外的所有主要數據庫都按照您的要求進行操作。

SQL Server,你可以效仿這種方式:

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 

,雖然這將是一點點比UDF效率較低。