我正在完成任务并发现一些麻烦。这是作业:
此作业将使用northwind数据库和Employees表。
这将是表用户定义的函数。
创建名为Employee_Name的用户定义函数。将员工ID作为参数传递。
返回ID与传递给用户定义函数的ID匹配的员工的名字,姓氏和电话号码。
创建一个使用该函数的查询,并返回id为5的员工信息。
到目前为止,这是我的解决方案:
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'.
答案 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 FUNCTION
和SELECT * ...
作为单独的查询运行,要么在它们之间插入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)