2016-04-11 20 views
1

に動作しない場合、私はWHERE句を使用するかを決定するために私のストアドプロシージャでこの条件を持っている:SQL Serverの:条件は、ストアドプロシージャ

IF (@communityDesc = 'All Areas') 
BEGIN 
    WHERE V_CONSTAT_ACTUAL_DATES.AREA_DESC IN (SELECT name 
               FROM dbo.splitstring(@communityDesc)) 
     AND V_CONSTAT_ACTUAL_DATES.DATE_TO_END >= GETDATE() 
END 
ELSE 
BEGIN 
    WHERE V_CONSTAT_ACTUAL_DATES.DATE_TO_END >= GETDATE() 
END 
ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 

が、私は、エラーの長いリストを取得:

Msg 156、レベル15、状態1、手順GetProductionSchedule、行256
キーワード 'WHERE'の近くに構文が正しくありません。

Msg 156、レベル15、状態1、手順GetProductionSchedule、行256
キーワード 'AND'の近くに構文が正しくありません。

私は間違っていますか?

答えて

1

それともは

SELECT * 
FROM [Table] 
WHERE V_CONSTAT_ACTUAL_DATES.DATE_TO_END >= GETDATE() 
     AND (@communityDesc = 'All Areas' 
      OR V_CONSTAT_ACTUAL_DATES.AREA_DESC IN (SELECT name 
                FROM dbo.splitstring(@communityDesc))) 

イムわからないあなたのロジックを持っているWHEREシングルへのロジックのすべてを置く:

if(@communityDesc = 'All Areas') 
BEGIN 

    SELECT * FROM Table 
    WHERE V_CONSTAT_ACTUAL_DATES.AREA_DESC IN 
    (select name from dbo.splitstring(@communityDesc)) 
    AND V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 
    ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 
END 
else 
BEGIN 
    SELECT * FROM Table 
    WHERE V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 
    ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 
END 

あなたの他のオプションは、条件付きでクエリを作成することですあなたがおそらく@communityDescを分割したいのであれば、それはAll Areasと等しくないと思います。

+0

の下に、これは完璧と高速であるようにさらに最適化することができ

-- your preceding select statements followed by this line SELECT * FROM V_CONSTAT_ACTUAL_DATES WHERE V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() AND NOT ( @communityDesc <> 'All Areas' OR V_CONSTAT_ACTUAL_DATES.AREA_DESC not IN (select name from dbo.splitstring(@communityDesc)) ) ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 

ように簡略化することができます。お気軽に – user979331

3

クエリを条件付きで分割することはできません。あなたは何かのようにする必要があります。

DECLARE @Query VARCHAR(1000) 

SET @Query = 'SELECT * FROM TABLE ' 

if(@communityDesc = 'All Areas') 
BEGIN 
    SET @Query = @Query + 
    'WHERE V_CONSTAT_ACTUAL_DATES.AREA_DESC IN (select name from dbo.splitstring(@communityDesc)) AND V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() ' 
END 
ELSE 

    SET @Query = @Query + 
    'WHERE V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() ' 
BEGIN 
    SET @Query = @Query + 'ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END' 
END 

exec sp_executesql @Query 
1

あなたは、おそらくこの

-- your preceding select statements followed by this line 
SELECT * FROM V_CONSTAT_ACTUAL_DATES 
WHERE 
(
@communityDesc = 'All Areas' AND 
V_CONSTAT_ACTUAL_DATES.AREA_DESC IN (select name from dbo.splitstring(@communityDesc)) AND 
V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 
) 
OR 
(@communityDesc <> 'All Areas' AND V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 
) 
ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 

のようにそれを書く必要がありますまた、これは

-- your preceding select statements followed by this line 
    SELECT * FROM V_CONSTAT_ACTUAL_DATES 
    LEFT JOIN (select name from dbo.splitstring(@communityDesc) Temp 
    ON Temp.name=V_CONSTAT_ACTUAL_DATES.AREA_DESC 
    WHERE 
     V_CONSTAT_ACTUAL_DATES.DATE_TO_END>=GETDATE() 
    AND NOT 
     (
    @communityDesc <> 'All Areas' OR Temp.Name is null 
    ) 
    ) 
    ORDER BY V_CONSTAT_ACTUAL_DATES.DATE_TO_END 
+0

ありがとうございます。 – user979331