MS SQL Server 中的标量 UDF 在查询中仅返回一个值

Posted

技术标签:

【中文标题】MS SQL Server 中的标量 UDF 在查询中仅返回一个值【英文标题】:Scalar UDF in MS SQL Server Only Returns one Value in Query 【发布时间】:2016-02-09 19:32:56 【问题描述】:

我想使用如下所示的标量 UDF 来执行逐行操作(我知道这样做的性能限制)。

CREATE FUNCTION [dbo].[correctAbsenceLess25](@value varchar(4))
RETURNS decimal(3,1)
AS
BEGIN

    If (@value) = 'A'
        RETURN -1
    If ((TRY_CONVERT(decimal(3,1),@value)) >= 0.0 AND (TRY_CONVERT(decimal(3,1),@value)) <= 25.0)
        RETURN @value

    RETURN CAST('Error happened here.' as decimal(3,1));

END

然后我从这样的查询中调用函数:

UPDATE assessmentData
SET assessmentData.weekReviewWk1 = dbo.correctAbsenceLess25(assessmentStaging.weekReviewWk1)
FROM assessmentStaging;

但是,我在assessmentData 表中只得到-1,尽管存在同时满足条件和一些应该引发错误的值的混合。

我知道它是一个标量 UDF 并返回一个值,但它意味着为查询给它的每个值返回一个值,即逐行执行操作和检查,不是吗?

【问题讨论】:

assessmentStaging 中 weekReviewWk1 列的值是多少,以及您如何将表assessmentData 与assessmentStaging 结合起来 【参考方案1】:

您将 varchar 变量传递给函数并返回/更新小数点。您可能需要考虑更改数据类型。

更新的表之间没有关系。您需要指定 UPDATE 修改的记录。您可以在更新中尝试 JOIN 以使用某些 ID 或字段组合来定位单个记录(或一组记录)。您的 UPDATE 和 FUNCTION 将变为如下所示:

ALTER FUNCTION [dbo].[correctAbsenceLess25](@value varchar(4))
RETURNS varchar(4)
--RETURNS decimal(3,1)
AS
BEGIN
     If (@value) = 'A'
         RETURN '-1'
     If ((TRY_CONVERT(decimal(3,1),@value)) >= 0.0 AND (TRY_CONVERT(decimal(3,1),@value)) <= 25.0)
         RETURN @value

       --RETURN CAST('Error happened here.' as decimal(3,1));
         RETURN 'Err';
END

还有表格/虚拟数据和 UPDATE 语句:

DROP TABLE assessmentStaging
CREATE TABLE assessmentStaging (
id int not null,
weekReviewWk1 varchar(4) not null
)

INSERT INTO assessmentStaging
VALUES
(1, 'A'),(2, '26'),(3, '25'),(4, '24'),(5, '2'),(6, '40'),(7, 'A')

DROP TABLE assessmentData
CREATE TABLE assessmentData (
id int not null,
weekReviewWk1 varchar(4) not null
)

INSERT INTO assessmentData
VALUES
(1, 'A'),(2, '26'),(3, '25'),(4, '24'),(5, '2'),(6, '40'),(7, 'A')

SELECT * FROM assessmentStaging

SELECT * FROM assessmentData

UPDATE  data
SET     data.weekReviewWk1 = dbo.correctAbsenceLess25(stage.weekReviewWk1)
FROM    assessmentData data
JOIN    assessmentStaging stage
ON      stage.id = data.id

【讨论】:

以上是关于MS SQL Server 中的标量 UDF 在查询中仅返回一个值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 标量 UDF 性能

SQL Server用户定义的函数(UDF)使用详解

从 ms 访问调用标量 UDF 函数

SQL CLR标量UDF中的DES解密不起作用

如何在 MS Access VB 中访问 SQL Server 标量函数

用东西 sql 修剪标量 UDF