0

冗長コードのストアド プロシージャが 2 つあります。SP は、選択元のテーブルによって異なります。この 2 つの 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 ..........

2 番目のストアド プロシージャは次のとおりです。

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 の値に基づいて、2 番目の SP を呼び出しています。ただし、select ステートメント、join 条件、および where 条件は、両方のストアド プロシージャで同じままです。冗長なコードを削除する必要があります。助けてください。

4

3 に答える 3

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 *付ける必要があります。とにかくそうするべきだと主張する人もいるかもしれませんが、今日は「やり遂げる」気分です.

于 2013-03-19T08:07:17.117 に答える
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 ..........
于 2013-03-19T07:53:15.680 に答える
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)すると、クエリ プランの再利用が促進され、セキュリティが向上する可能性が高くなります。さらに、このアプローチを使用すると、クエリに渡されるデータ値が正しいデータ型であることを確認できます。

SQL Server で動的 SQL コマンドを実行する

于 2013-03-19T08:06:47.857 に答える