2013-03-19 64 views
0

我有兩個冗餘代碼的存儲過程。 SP將根據所選表格而有所不同。我想結合這兩個SP。請幫忙。結合SQL Server中的兩個SPP

主要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條件保持不變。我需要刪除冗餘代碼。請幫忙。

回答

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 * - 有人可能會堅持認爲你應該這樣做,但今天我處於「完成它」的心情。

+0

我認爲它應該是'UNION';它將幫助刪除重複項。 – Tebo 2013-03-19 08:17:51

+0

@Damien:例如,如果該函數只返回12行,僱員表有5000行,並假設如果我需要單獨的函數輸出(考慮第二個SP),那麼在這種情況下,它也會返回來自兩者的所有行條件,它會失敗吧? – 2013-03-19 08:27:09

+0

@ColourBlend - WHERE條款是互斥的。 – 2013-03-19 08:35:04

0
CREATE PROCEDURE [dbo].[spGetEmployeesBySearchString]    
------------- 
------------- 
@OtherListType_ID INT, 
@manager_employee_number VARCHAR(255) 
------------- 
------------- 
DECLARE @IsGetFullTeamUnderManager bit=0 
IF (@[email protected] 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 .......... 
+0

這裏我還需要重複整個select語句,連接條件和where條件。主要目標是消除冗餘,因爲SP中有更多的條件。有沒有其他方法? – 2013-03-19 07:54:58

+0

您能給所有的條件的功能和選擇語句的例子嗎? – 2013-03-19 08:04:42

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)更有可能促進查詢計劃重用並提高安全性。另外,使用這種方法可以確保傳遞給查詢的數據值是正確的數據類型。

更多的閱讀 Execute Dynamic SQL commands in SQL Server