MS 中的标量 UDF SQL 仅限服务器 Returns 查询中的一个值
Scalar UDF in MS SQL Server Only Returns one Value in Query
我想使用如下所示的标量 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
table 中只得到 -1,尽管存在满足两个条件的值和一些应该引发错误的值的混合。
我知道它是一个标量 UDF,return 是一个值,但它的意思是 return 查询给它的每个值一个值,即逐行执行操作和支票,不是吗?
您正在将 varchar 变量传递给函数,并且 returning/updating 带有小数。您可能需要考虑更改数据类型。
更新的表之间没有关系。您需要指定 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
以及 tables/dummy 数据和 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
我想使用如下所示的标量 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
table 中只得到 -1,尽管存在满足两个条件的值和一些应该引发错误的值的混合。
我知道它是一个标量 UDF,return 是一个值,但它的意思是 return 查询给它的每个值一个值,即逐行执行操作和支票,不是吗?
您正在将 varchar 变量传递给函数,并且 returning/updating 带有小数。您可能需要考虑更改数据类型。
更新的表之间没有关系。您需要指定 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
以及 tables/dummy 数据和 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