2017-03-01 16 views
2

SQL Serverでは、テーブル内の列の値に基づいて特定のストアドプロシージャ/インライン選択ステートメントを呼び出す方法はありますか?SQL Serverの行の値に基づいて特定のストアドプロシージャ/ selectステートメントを呼び出す

など。表#IdNumbers(下)の各行について、Number列の値をチェックします。値が1の場合は最初のストアド・プロシージャをコールし、値が2の場合は2番目のプロシージャをコールします。

私は以下のコードと似たようなものを実現しようとしています(しかし、擬似コードはありません)。

CREATE PROCEDURE [CallSpecificStoredProcedure] 
(
@Name VARCHAR(50) 
,@StartDate DATETIME 
,@EndDate DATETIME 
) 
AS 
BEGIN 
CREATE TABLE #IdNumbers 
( 
    Id UNIQUEIDENTIFIER, 
    Number INT 
) 

INSERT INTO #IdNumbers 
exec GetIdNumbers @StartDate, @EndDate 

--for each row in #IdNumbers 
    --If Number = 1 
    exec StoredProcedure1(Id, Number, @Name, @StartDate, @EndDate) 

    --else If Number = 2 
    exec StoredProcedure2(Id, Number, @Name, @StartDate, @EndDate) 

    --else If Number = 3 
    exec StoredProcedure3(Id, Number, @Name, @StartDate, @EndDate) 
END 

答えて

2

これにはカーソルが必要です。これがうまくいけば動作します:

CREATE PROCEDURE [p_CallSpecificStoredProcedure] 
(
    @Name VARCHAR(50), 
    @StartDate DATETIME, 
    @EndDate DATETIME 
) 
AS 
BEGIN 
CREATE TABLE #IdNumbers 
( 
    Id UNIQUEIDENTIFIER, 
    Number INT 
) 

INSERT INTO #IdNumbers 
exec GetIdNumbers @StartDate, @EndDate 

DECLARE @Id UNIQUEIDENTIFIER 
DECLARE @Number INT 
DECLARE IdCursor CURSOR FAST_FORWARD FOR 
SELECT Id, Number FROM #IdNumbers 

OPEN IdCursor 
FETCH NEXT FROM IdCursor 
INTO @Id, @Number 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF @Number = 1 
    EXEC StoredProcedure1 @Id, @Number, @Name, @StartDate, @EndDate 
    ELSE IF @Number = 2 
    EXEC StoredProcedure2 @Id, @Number, @Name, @StartDate, @EndDate 
    ELSE IF @Number = 3 
    EXEC StoredProcedure3 @Id, @Number, @Name, @StartDate, @EndDate 

    FETCH NEXT FROM IdCursor 
    INTO @Id, @Number 
END 
CLOSE IdCursor 
DEALLOCATE IdCursor 

END 
+0

グレート。あなたは少し速かったです。 –

+0

@teovankot私はあなたのことを読んでいます。アイデアは問題ありませんが、ほとんどの質問から継承されたいくつかのバグがあります –

+0

私は自分のソリューションにカーソルを使用する必要があると感じました。あなたはこれを達成するための代替方法を知っていますか?私はカーソルの周りに多くの嫌悪感を見たことがありますが、私は個人的にそれらが良いか悪いかを知ることはできません。なぜならそれは効率とは何かを前提としているからです。 – axel

1

私はあなたがCURSORを探しているGESS。

CREATE PROCEDURE [CallSpecificStoredProcedure] 

@Name VARCHAR(50) 
,@StartDate DATETIME 
,@EndDate DATETIME 

AS 
BEGIN 
CREATE TABLE #IdNumbers 
( 
    Id UNIQUEIDENTIFIER, 
    Number INT 
) 

INSERT INTO #IdNumbers EXEC GetIdNumbers @StartDate, @EndDate --Hope here you insert your numbers 

DECLARE @Id UNIQUEIDENTIFIER 
DECLARE @Number INT 

DECLARE NUMBERS_CURSOR CURSOR 
    LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR 
SELECT Id, Number 
FROM #IdNumbers 

OPEN NUMBERS_CURSOR 
FETCH NEXT FROM NUMBERS_CURSOR INTO @Id, @Number 
WHILE @@FETCH_STATUS = 0 --If there is still rows 
BEGIN 
    --here your logic 
    IF @Number = 1 
    BEGIN 
    EXEC StoredProcedure1 @Id, @Number, @Name, @StartDate, @EndDate 
    END 
    IF @Number = 2 
    BEGIN 
    EXEC StoredProcedure2 @Id, @Number, @Name, @StartDate, @EndDate 
    END 

    FETCH NEXT FROM NUMBERS_CURSOR INTO @Id, @Number 
END 
CLOSE NUMBERS_CURSOR 
DEALLOCATE NUMBERS_CURSOR 
関連する問題