【问题标题】:Sub-query returned more than 1 value: executing UDF子查询返回超过 1 个值:正在执行 UDF
【发布时间】:2020-08-26 10:32:54
【问题描述】:

我在这个示例中使用 AdventureWorks 2007,尝试输入员工的生日并返回他们的年龄

CREATE FUNCTION UDF_EmpAge  (@BusinessEntityID  VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
    DECLARE @Emp_Age VARCHAR(50)
    SET @Emp_Age = (SELECT  DATEDIFF(YY,[BirthDate],GETDATE()) FROM HumanResources.Employee)
    RETURN  
    (
        SELECT @Emp_Age 
        FROM HumanResources.Employee 
        WHERE BusinessEntityID = @BusinessEntityID
    )
END
GO

例如当我尝试运行它时

SELECT  dbo.UDF_EmpAge(2)

消息 512,第 16 级,状态 1,第 50 行
子查询返回超过 1 个值。当子查询
跟在 =, !=, , >= 之后或当子查询用作表达式时,这是不允许的。

【问题讨论】:

  • 这一行SET @Emp_Age = (SELECT DATEDIFF(YY,[BirthDate],GETDATE()) FROM HumanResources.Employee) - 错误是因为表中有多个记录,而您没有指定要哪一个。

标签: sql sql-server tsql date stored-procedures


【解决方案1】:

您的第一个查询返回多行,因此您不能将其分配给标量变量。

无论如何,我看不出中间查询的意义。可以直接使用参数过滤表格,将日期函数的结果赋值给变量(应该是整数而不是字符串)。

考虑:

CREATE FUNCTION UDF_EmpAge(@BusinessEntityID VARCHAR(50))
RETURNS INT
AS
BEGIN
    DECLARE @Emp_Age INT;

    SELECT @Emp_Age = DATEDIFF(YY, [BirthDate] ,GETDATE()) 
    FROM HumanResources.Employee
    WHERE BusinessEntityID = @BusinessEntityID;

    RETURN @Emp_Age;
END

请注意,这假定 BusinessEntityIDHumanResources.Employee 表(或其主键)中的唯一键。

【讨论】:

    【解决方案2】:

    您根本不需要任何变量。您可以只返回查询结果:

    CREATE FUNCTION UDF_EmpAge (@BusinessEntityID  VARCHAR(50))
    RETURNS INT
    AS
    BEGIN
        RETURN(SELECT DATEDIFF(YEAR, BirthDate, GETDATE()) 
               FROM Employee 
               WHERE BusinessEntityID = @BusinessEntityID
              );
    END;
    

    Here 是一个 dbfiddle。请注意,“年龄”更恰当地被认为是一个数字。 datediff() 返回一个整数。将此值作为字符串返回是没有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2016-04-10
      • 1970-01-01
      相关资源
      最近更新 更多