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来测试它。案例陈述将起作用。