這裏是一個基本的,你可以工作,我會小心在查詢中使用這個,因爲它會按比例它們放慢它在使用的行數:
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
謝謝。此代碼是否可以在SQL 2000中工作? – DavidStein 2010-02-18 16:25:27
@David Stein,如果你使用SQL 2000,你應該添加(不改變)一個標籤到問題:「sql-server-2000」。我認爲這個函數會起作用,我沒有SQL 2000來測試它。 CASE聲明將起作用。 – 2010-02-18 16:41:14