在SQL Server中合并两个SP

在SQL Server中合并两个SP,sql,sql-server-2008,stored-procedures,redundancy,Sql,Sql Server 2008,Stored Procedures,Redundancy,我有两个冗余代码的存储过程。SPs将根据所选表格的不同而有所不同。我想合并这两个SP。请帮忙 CREATE PROCEDURE [dbo].[spGetEmployeesBySearchString] ------------- ------------- @OtherListType_ID INT, @manager_employee_number VARCHAR(255) ------------- ------------- DECLARE @IsGetFullTe

我有两个冗余代码的存储过程。SPs将根据所选表格的不同而有所不同。我想合并这两个SP。请帮忙

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 ..........
主要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 ..........
在主SP中,基于@OtherListType_ID的值,我调用第二个SP。但是select语句、join条件和where条件在两个存储过程中保持相同。我需要删除多余的代码。请帮忙

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 ..........
您还应该知道有更好的方法来执行动态sql语句。

使用
EXEC SP\u EXECUTESQL(@SQL)
而不是
EXEC(@SQL)
更有可能促进查询计划重用并提高安全性。此外,使用这种方法可以确保传递到查询中的数据值是正确的数据类型

更多阅读
通常,您不能在
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*
-有些人可能会坚持认为您应该这样做,但今天我正处于“完成”状态。

这里我还需要重复整个SELECT语句,连接条件和where条件。主要目的是消除冗余,因为SP中有更多的条件。还有其他方法吗?请给出函数示例和包含所有条件的select语句吗?我认为应该是
UNION
;它将有助于删除重复项。@Damien:例如,如果函数只返回12行,employee表有5000行,假设我只需要函数的输出(考虑第二个SP),然后在这种情况下,它也将返回两个条件中的所有行,它将失败,对吗?@colorBlend-其中的
子句是互斥的。@prabuR-其中的
子句是互斥的-它要么从函数中选择,要么从
员工中选择,但决不能同时选择两者。正如我所说,希望优化器能够看到这一点,而不是实际执行无意义的工作,但是
WHERE
子句应该防止它从这两个方面返回行branches@Damien_The_Unbeliever现在可以看到
其中@IsGetFullTeamUnderManager=0
。更好的解决方案:)
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 ..........