我正在尝试使用一个部门名称和 返回特定部门的所有员工详细信息。
如果没有传入部门名称,则必须返回所有员工。
我正在尝试上面的代码,但未显示预期结果
CREATE PROCEDURE SelectEmployee @name varchar(50)
AS
Select * from Employees WHERE name = @name
GO;
表结构
[Department]
(
[departmentID] INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[name] VARCHAR(50) NOT NULL,
[costCentreID] INT FOREIGN KEY REFERENCES CostCentre(costCentreID)
);
[Employees]
(
[employeeNo] INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[lastName] VARCHAR(50) NOT NULL,
[firstName] VARCHAR(50) NOT NULL,
[gender] CHAR NOT NULL,
[IDNumber] VARCHAR(20) NOT NULL,
[salaryLevelID] INT,
[departmentID] INT FOREIGN KEY REFERENCES Department(departmentID)
);
答案 0 :(得分:2)
如Larnu所建议的那样,您需要将表join
显式地在一起,以从两个满足join
条件的地方得到结果。
对于您来说,这看起来像这样:
select e.employeeNo,
e.lastName,
e.firstName,
e.gender,
e.IDNumber,
e.salaryLevelID,
e.departmentID,
d.name as departmentName
from Department as d
join Employees as e
on d.departmentID = e.departmentID
where d.name = @name
但是,在没有提供@name
值的情况下返回所有雇员的附加逻辑将要求您将参数设为可选,并且存储过程中的脚本能够处理提供值和提供值的地方不是。
答案 1 :(得分:2)
如果您想在没有给出姓名的情况下带回所有员工,则可以修改过程以接受可选参数。
您提供的查询在ELSE语句中包含不必要的JOIN,因为您想返回所有员工。因此,请考虑以下几点:
CREATE PROCEDURE SelectEmployee @name varchar(50) = ''
AS
IF (@name <> '')
BEGIN
select e.employeeNo,
e.lastName,
e.firstName,
e.gender,
e.IDNumber,
e.salaryLevelID,
e.departmentID,
d.name as departmentName
from Department as d
join Employees as e
on d.departmentID = e.departmentID
where d.name = @name
END
ELSE
BEGIN
select e.employeeNo,
e.lastName,
e.firstName,
e.gender,
e.IDNumber,
e.salaryLevelID,
e.departmentID,
'ALL' as departmentName
from Employees e
END
因此您可以像这样运行它以获取所有薪资雇员:
EXEC SelectEmployee 'Payroll'
或者像这样才能吸引所有员工
EXEC SelectEmployee