2016-12-16 8 views
0

行番号25のエラー: ユーザーが選択した組み合わせに基づいてデータを返すストアドプロシージャを作成しています。例として、私は3種類のフィルター(市/区域/ベンダータイプ)を持っています。ユーザーがCity = xyzとArea = pqrを選択した場合、結果はCity = xyzとArea = pqrのみのすべてのデータでなければなりません。ユーザーがオプションを選択しなかった場合、3つのパラメータの値をすべて設定するとnullになり、データベースからすべての行が返されます。 注:上記の3つの列には、常にデータベースにデータが含まれている必要があります。 私はSQL接続を使用してこのストアドプロシージャを呼び出すための[WEBMethod]を1つ作成しました。 AJAX jqueryを使用してすべてのパラメータを渡します。エラー156重大度15状態1キーワードの近くに不正な構文IF

ALTER PROCEDURE [dbo].spGetVendorbyFilter 
         @PageNumber INT, 
         @PageSize INT, 
         @city  VARCHAR(200), 
         @area  VARCHAR(200), 
         @vendortype VARCHAR(200) 
AS 
    BEGIN 
     DECLARE @StartRow INT 
     DECLARE @EndRow INT 

     SET @StartRow = ((@PageNumber - 1) * @PageSize) + 1; 
     SET @EndRow= @PageNumber * @PageSize; 

     WITH Result 
      AS (
       SELECT *, 
         Row_number() 
         OVER (
          ORDER BY VendorID ASC) RowNumber 
       FROM tblVendor 

      ) 

    IF (@city IS NOT NULL AND @area IS NULL AND @vendortype IS NULL) 
     SELECT * 
     FROM Result where [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE IF (@city IS NULL AND @area IS NOT NULL AND @vendortype IS NULL) 
     SELECT * 
     FROM Result where [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE IF (@city IS NULL AND @area IS NULL AND @vendortype IS NOT NULL) 
     SELECT * 
     FROM Result where [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE IF (@city IS NOT NULL AND @area IS NOT NULL AND @vendortype IS NULL) 
     SELECT * 
     FROM Result where [email protected] And [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE IF (@city IS NOT NULL AND @area IS NULL AND @vendortype IS NOT NULL) 
     SELECT * 
     FROM Result where [email protected] And [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE IF (@city IS NULL AND @area IS NOT NULL AND @vendortype IS NOT NULL) 
     SELECT * 
     FROM Result where [email protected] And [email protected] AND RowNumber BETWEEN @StartRow and @EndRow 
    ELSE 
     SELECT * 
     FROM Result WHERE RowNumber BETWEEN @StartRow and @EndRow 

END 
+0

申し訳ありませんミラノ、IF文を使用して条件付きCTEを生成することはできません。私は考えているのですか?パラメータAreaとVendorTypeをオプションにしたいのですか? –

+0

@Destination - あなたの返答をありがとう。多分あなたは正しいです。ユーザーが3つのオプション(市区町村/エリア/ベンダータイプ)を選択すると、それに応じてデータが必要です。オプションが1つも選択されていない場合は、すべてのデータが表示されます。 – MRG

答えて

1

このようなCTEは使用できません。 CTEは、これらのいずれかで終了する必要があります。SELECT/INSERT/DELETE

@cityあなたは[email protected]を比較しているので、あなたのELSE条件は失敗しますNULLあるとき、あなたのIf条件によります。あなたが間違っていない場合は、これを探しています。

ALTER PROCEDURE [dbo].[Spgetvendorbyfilter] @PageNumber INT, 
              @PageSize INT, 
              @city  VARCHAR(200), 
              @area  VARCHAR(200), 
              @vendortype VARCHAR(200) 
AS 
    BEGIN 
     DECLARE @StartRow INT 
     DECLARE @EndRow INT 

     SET @StartRow = ((@PageNumber - 1) * @PageSize) + 1; 
     SET @EndRow= @PageNumber * @PageSize; 

     WITH Result 
      AS (SELECT *, 
         Row_number() 
         OVER (
          ORDER BY VendorID ASC) RowNumber 
       FROM tblVendor 
       WHERE (City = @city 
         OR @city IS NULL) 
         AND (Area = @area 
          OR @area IS NULL) 
         AND (Category = @vendortype 
          OR @vendortype IS NULL)) 
     SELECT * 
     FROM Result 
     WHERE RowNumber BETWEEN @StartRow AND @EndRow 
    END 
+0

ご返信ありがとうございます。実際に私はストアドプロシージャの新機能です。正しい構文を教えてください。 – MRG

+0

@MilanGadhiya - あなたは私の答えを試しました –

+0

私は上記のストアドプロシージャを書いて、別の塗りつぶしの組み合わせでデータを抽出しています。 – MRG

関連する問題