Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 寻找一个通用的;最低限度;用户定义函数_Sql Server_Tsql - Fatal编程技术网

Sql server 寻找一个通用的;最低限度;用户定义函数

Sql server 寻找一个通用的;最低限度;用户定义函数,sql-server,tsql,Sql Server,Tsql,我创建了以下函数来简化一段特别复杂的代码 CREATE FUNCTION [dbo].[DSGetMinimumInt] (@First INT, @Second INT) RETURNS INT AS BEGIN IF @First < @Second RETURN @First RETURN @Second END 创建函数[dbo].[DSGetMinimumInt](@First INT,@Second INT) 返回整数 作为 开始 如果@First

我创建了以下函数来简化一段特别复杂的代码

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

END
创建函数[dbo].[DSGetMinimumInt](@First INT,@Second INT)
返回整数
作为
开始
如果@First<@Second
返回@First
返回@秒
结束
但是,它仅适用于INT数据类型。我知道我可以为numeric创建一个,也可能为Varchar和Datetime创建一个

是否可以创建一个主“最小”函数来处理所有这些问题?有人这样做过吗


我已经在谷歌上搜索过了,但结果是空的

除了
SQL Server
之外的所有主要数据库都支持
LEAST
grest
这两个数据库,它们可以满足您的需要

在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

稍低,但除了
sqlserver
之外的所有主要数据库都支持
最小的
最大的

在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

稍低,但这是一个基本的,您可以使用它,我会在查询中小心使用它,因为它会根据使用它的行数按比例降低查询速度:

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
测试输出:

2010-01-01 00:00:00.000
5
abc
如果要在查询中使用此语句,我将只使用内联CASE语句,这将比UDF快得多:

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

当@valueAnyType1这是一个基本的查询时,我会小心地在查询中使用它,因为它会根据所使用的行数按比例降低查询速度:

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
测试输出:

2010-01-01 00:00:00.000
5
abc
如果要在查询中使用此语句,我将只使用内联CASE语句,这将比UDF快得多:

CASE
    WHEN @valueAnyType1<@ValueAnyType2 THEN @valueAnyType1
    ELSE @ValueAnyType2
END
案例
当@valueAnyType1Azure SQL DB(以及未来的SQL Server版本)现在支持最大/最小值时:

Azure SQL DB(以及未来的SQL Server版本)现在支持最大/最小:


@David Stein,如果您使用的是SQL 2000,您应该在问题中添加(而不是更改)一个标记:“SQL-server-2000”。我认为这个函数可以工作,我没有SQL 2000来测试它。CASE语句将起作用。@David Stein,如果您使用的是SQL 2000,您应该在问题中添加(而不是更改)一个标记:“SQL-server-2000”。我认为这个函数可以工作,我没有SQL 2000来测试它。案例陈述将起作用。