Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 将参数传递给函数;子查询返回了多个值。这是不允许的_Sql_Sql Server - Fatal编程技术网

Sql 将参数传递给函数;子查询返回了多个值。这是不允许的

Sql 将参数传递给函数;子查询返回了多个值。这是不允许的,sql,sql-server,Sql,Sql Server,我希望函数返回通过参数传递给函数的指定日期内员工的年龄 DROP FUNCTION IF EXISTS dbo.f_Employee_Age; GO CREATE FUNCTION f_Employee_Age(@date DATE) RETURNS INT AS BEGIN RETURN (SELECT DATEDIFF(yy, BirthDate, @date) FROM Employee) END; GO SELECT dbo.f_Employee_Age('2012-12-2

我希望函数返回通过参数传递给函数的指定日期内员工的年龄

DROP FUNCTION IF EXISTS dbo.f_Employee_Age;
GO

CREATE FUNCTION f_Employee_Age(@date DATE)
RETURNS INT
AS
BEGIN
    RETURN (SELECT DATEDIFF(yy, BirthDate, @date) FROM Employee)
END;
GO

SELECT dbo.f_Employee_Age('2012-12-21')
FROM Employee
WHERE FirstName LIKE 'Andrew';
当我尝试在没有函数的情况下运行时,它工作得非常好

SELECT DATEDIFF(yy, BirthDate, '2012-12-21')
FROM Employee
WHERE FirstName LIKE 'Andrew';
但如果我将日期参数传递给函数,则会出现以下错误:

消息512,第16级,状态1,第12行
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

我希望函数返回通过参数传递给函数的指定日期内员工的年龄

DROP FUNCTION IF EXISTS dbo.f_Employee_Age;
GO

CREATE FUNCTION f_Employee_Age(@date DATE)
RETURNS INT
AS
BEGIN
    RETURN (SELECT DATEDIFF(yy, BirthDate, @date) FROM Employee)
END;
GO

SELECT dbo.f_Employee_Age('2012-12-21')
FROM Employee
WHERE FirstName LIKE 'Andrew';
这里的关键是员工。如果您编写以下代码,工作代码将更加清晰:

SELECT DATEDIFF(year, e.BirthDate, '2012-12-21')
----------------------^ this is a value from a single row
FROM Employee e
WHERE e.FirstName LIKE 'Andrew';
您需要将这两个值传入:

CREATE FUNCTION f_Employee_Age (
    @dob DATE,
    @date DATE
)
RETURNS INT AS
BEGIN
    RETURN(DATEDIFF(year, @dob, @date);
END;
或者可以确定员工的身份:

CREATE FUNCTION f_Employee_Age (@Employee_Id @date DATE)
RETURNS INT
AS
BEGIN
    RETURN(SELECT DATEDIFF(yy, BirthDate, @date)
           FROM Employee e
           WHERE e.Employee_Id = @Employee_Id
END;
您可以将此版本称为:

dbo.f_Employee_Age(e.Employee_Id, '2012-12-21')
或者,您可以创建一个内联表值函数,该函数返回所有员工截至该日期的年龄:

CREATE FUNCTION f_Employee_Age (
    @date DATE
)
RETURNS TABLE
    RETURN (SELECT e.*, DATEDIFF(year, e.BirthDate, @date)
            FROM employees e
           );
这将被称为:

SELECT ea.age
FROM  dbo.f_Employee_Age ea('2012-12-21') ea
WHERE ea.FirstName LIKE 'Andrew';

在表值内联函数中,在许多方面都类似于参数化视图。

发生错误的原因是函数中的select语句没有WHERE子句,因此将为employee表中的每一行返回一个值。仅供参考,年份的差异不是某个人的年龄;26天前出生的人是去年出生的,但离他们1岁还有一段时间。@klmtsgw您也可以像第一个函数一样应用iTVF,这样做的好处是比标量函数更快,同时不需要包含对
employee
表的引用