用户定义的函数 - Northwind数据库 - Employee_Name函数

时间:2013-11-24 21:33:16

标签: sql sql-server function tsql user-defined-functions

我正在完成任务并发现一些麻烦。这是作业:

此作业将使用northwind数据库和Employees表。

这将是表用户定义的函数。

  1. 创建名为Employee_Name的用户定义函数。将员工ID作为参数传递。

  2. 返回ID与传递给用户定义函数的ID匹配的员工的名字,姓氏和电话号码。

  3. 创建一个使用该函数的查询,并返回id为5的员工信息。

  4. 到目前为止,这是我的解决方案:

    CREATE FUNCTION dbo.Employee_Name(@employId int)
    RETURNS TABLE
    AS 
    RETURN(
        SELECT FirstName,LastName,HomePhone 
        FROM dbo.Employees 
        WHERE EmployeeID = @employId
        GROUP BY EmployeeID
    )
    
    SELECT * FROM dbo.Employee_Name(5);
    GO
    

    以下是我收到的错误:

    Msg 156, Level 15, State 1, Procedure Employee_Name, Line 11
    Incorrect syntax near the keyword 'SELECT'.
    

3 个答案:

答案 0 :(得分:1)

您必须单独创建并使用它。在开始处理#3之前运行CREATE语句。
从技术上讲,您也可以在示例代码中的最终GO之前插入SELECT,它应该可以正常工作。

答案 1 :(得分:1)

您的函数未创建,因为SELECT语句:

SELECT FirstName,LastName,HomePhone 
FROM dbo.Employees 
WHERE EmployeeID = @employId
GROUP BY EmployeeID

不正确(它包含SELECT中的3个字段和一个,在GROUP BY中完全不同)。

事实上,您甚至不需要GROUP BY,因为EmployeeID是一个唯一值。只需创建您的功能

CREATE FUNCTION dbo.Employee_Name(@employId int)
RETURNS TABLE
AS 
RETURN(
    SELECT FirstName,LastName,HomePhone 
    FROM dbo.Employees 
    WHERE EmployeeID = @employId
)

然后您的SELECT * FROM dbo.Employee_Name(5)将有效。

是的,正如@KekuSemau指出的那样,要么将CREATE FUNCTIONSELECT * ...作为单独的查询运行,要么在它们之间插入GO - CREATE必须在一个单独的批处理中。

答案 2 :(得分:-1)

试试这个:

CREATE FUNCTION dbo.Employees_Name(@employeeID int)
Returns Table
AS
Return(
   SELECT FirstName,LastName,PhoneNumber
   FROM dbo.Employees
   WHERE EmployeeID = @employID
   )

   GO
   SELECT * FROM dbo.Employees_Name(5)