我有两个冗余代码存储过程。 SP将根据选择它的表而不同。我想结合这两个SP。请帮忙。
主要SP是:
CREATE PROCEDURE [dbo].[spGetEmployeesBySearchString]
-------------
-------------
@OtherListType_ID INT
@manager_employee_number VARCHAR(255)
-------------
-------------
DECLARE @IsGetFullTeamUnderManager bit=0
IF (@OtherListType_ID=3 AND @manager_employee_number IS NOT NULL)
SET @IsGetFullTeamUnderManager = 1
IF (@IsGetFullTeamUnderManager=1)
BEGIN
EXEC spFullTeamUnderManager <<Parameters>>
RETURN
END
SELECT e.a,e.b,e.c,e.d,......
FROM Employee emp
INNER JOIN .....
WHERE ..........
第二个存储过程是:
CREATE PROCEDURE [dbo].[spFullTeamUnderManager]
-------------
-------------
-------------
SELECT e.a,e.b,e.c,e.d,......
FROM dbo.fnFullTeamUnderManager(@manager_employee_number) emp
INNER JOIN .....
WHERE ..........
在主SP中,基于@OtherListType_ID的值,我正在调用第二个SP。但是,存储过程中的select语句,连接条件和where条件保持不变。我需要删除冗余代码。请帮忙。
答案 0 :(得分:1)
通常,您不能在FROM
子句中参数化行集源。您可以执行以下操作,并希望优化器足够聪明,可以正确执行:
SELECT e.a,e.b,e.c,e.d,......
FROM (
SELECT * FROM dbo.fnFullTeamUnderManager(@manager_employee_number) WHERE @IsGetFullTeamUnderManager=1
UNION ALL
SELECT * FROM Employee WHERE @IsGetFullTeamUnderManager=0
) emp
INNER JOIN .....
WHERE ..........
如果函数和Employee
不共享完全相同的列,则必须明确命名公共列,而不是使用SELECT *
- 有些人可能会坚持认为你应该这样做,但是今天我正处于“完成它”的心情。
答案 1 :(得分:0)
CREATE PROCEDURE [dbo].[spGetEmployeesBySearchString]
-------------
-------------
@OtherListType_ID INT,
@manager_employee_number VARCHAR(255)
-------------
-------------
DECLARE @IsGetFullTeamUnderManager bit=0
IF (@OtherListType_ID=@FullTeam AND @manager_employee_number IS NOT NULL)
SET @IsGetFullTeamUnderManager = 1
IF (@IsGetFullTeamUnderManager=1)
BEGIN
SELECT e.a,e.b,e.c,e.d,......
FROM dbo.fnFullTeamUnderManager(@manager_employee_number) emp
INNER JOIN .....
WHERE ..........
END
SELECT e.a,e.b,e.c,e.d,......
FROM Employee emp
INNER JOIN .....
WHERE ..........
答案 2 :(得分:0)
CREATE PROCEDURE [dbo].[spGetEmployeesBySearchString]
-------------
-------------
@OtherListType_ID INT
@manager_employee_number VARCHAR(255)
-------------
-------------
-- Me
DECLARE @SQL varchar(3000);
DECLARE @TableName varchar(30);
SET @TableName = 'Employee ';
DECLARE @IsGetFullTeamUnderManager bit=0
IF (@OtherListType_ID=3 AND @manager_employee_number IS NOT NULL)
SET @IsGetFullTeamUnderManager = 1
IF (@IsGetFullTeamUnderManager=1)
BEGIN
SET @TableName = 'dbo.fnFullTeamUnderManager(' + @manager_employee_number +') ';
END
SET @SQL = 'SELECT e.a,e.b,e.c,e.d
FROM ' + @TableName + ' emp
INNER JOIN .....
WHERE a = ' + convert(varchar(4), @aNumber);
EXEC(@SQL);
您还应该知道有更好的方法来执行动态sql语句。
使用EXEC SP_EXECUTESQL(@SQL)
代替EXEC(@SQL)
更有可能促进查询计划重用并提高安全性。此外,使用此方法可以确保传递给查询的数据值是正确的数据类型。