SQLクエリから2セットの結果を返す

無し

私のストアドプロシージャは次のようなものです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Product_Search]
(
    /* Optional Filters for Dynamic Search*/
   @ProductName NVARCHAR(200)=NULL,

   /*– Pagination Parameters */
   @PageNo INT = 1,
   @PageSize INT = 10,

   /*– Sorting Parameters */
   @SortColumn NVARCHAR(20) = 'ProductAddedDate',
   @SortOrder NVARCHAR(4)='ASC',
   @PostCodes NVARCHAR(400)=NULL
)
AS
BEGIN
    /*–Declaring Local Variables corresponding to parameters for modification */
    DECLARE 
        @lPageNbr INT,
        @lPageSize INT,
        @lSortCol NVARCHAR(20),
        @lFirstRec INT,
        @lLastRec INT,
        @lTotalRows INT

    /*Setting Local Variables*/

    SET @lPageNbr = @PageNo
    SET @lPageSize = @PageSize
    SET @lSortCol = LTRIM(RTRIM(@SortColumn))

    SET @lFirstRec = ( @lPageNbr - 1 ) * @lPageSize
    SET @lLastRec = ( @lPageNbr * @lPageSize + 1 )
    SET @lTotalRows = @lFirstRec - @lLastRec + 1; 

    WITH CTE_Results AS 
    (
        SELECT ROW_NUMBER() OVER 
            (
                ORDER BY
                    CASE WHEN @lSortCol = 'ProductAddedDate' AND @SortOrder='ASC'
                        THEN ProductName
                    END ASC,
                    CASE WHEN @lSortCol = 'ProductAddedDate' AND @SortOrder='DESC'
                         THEN ProductName
                    END DESC,
                     CASE WHEN (@lSortCol = 'Price' AND @SortOrder='ASC')
                              THEN Price
                    END ASC,
                    CASE WHEN @lSortCol = 'Price' AND @SortOrder='DESC'
                             THEN Price
                    END DESC
           ) AS ROWNUM,
            Count(*) over () AS TotalCount, 
            Id as ProductId ,
            ProductName,
            ProductDescription,
            [Price] ,
            [FairName] ,
            [FairDescription] ,
            [StartDate],
            [EndDate]  ,
            [FairLogo] ,
            [ProductAddedDate],
            ProductCategory_Id,
            FairId,
            IsHeroItem,
            ProductSubCategoryId ,
            SubCategoryName,
            MainCategoryName 
        FROM wf_view_Products
        WHERE  
            (@ProductName is NULL OR ProductName like '%'+ @ProductName+ '%') AND 
            (@PostCodes is NULL OR PostCode IN( SELECT CAST(Item AS INTEGER) FROM dbo.SplitString(@PostCodes, ',')))
    )   
    SELECT ProductId,
        ROWNUM,
        ProductCategory_Id,
        IsHeroItem,
        ProductName,
        ProductDescription,
        [Price],
        [FairName],
        [FairDescription],
        [StartDate],
        [EndDate],
        [FairLogo],
        [ProductAddedDate],
        FairId
    FROM CTE_Results AS CPC
    WHERE ROWNUM > @lFirstRec
        AND ROWNUM < @lLastRec
    ORDER BY ROWNUM ASC

    SELECT ProductId
    FROM CTE_Results AS Categories
    WHERE 1 = 1
END

この行を削除すると、すべてが機能します。それ以外の場合は、エラーがスローされます。

メッセージ208、レベル16、状態1、プロシージャProduct_Search、行65
[バッチ開始行2]
無効なオブジェクト名 'CTE_Results'

誰かが私にこれを解決する方法を教えてもらえますか?

アンドレア

コメントで示唆されているように、一時テーブル(または必要に応じてテーブル変数も使用できますが、この場合はテーブルの構造を定義する必要があります)を使用できます。

一時テーブルを使用するように編集されたストアドプロシージャは次のとおりです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Product_Search]
(
    /* Optional Filters for Dynamic Search*/
   @ProductName NVARCHAR(200)=NULL,

   /*– Pagination Parameters */
   @PageNo INT = 1,
   @PageSize INT = 10,

   /*– Sorting Parameters */
   @SortColumn NVARCHAR(20) = 'ProductAddedDate',
   @SortOrder NVARCHAR(4)='ASC',
   @PostCodes NVARCHAR(400)=NULL
)
AS
BEGIN
    /*–Declaring Local Variables corresponding to parameters for modification */
    DECLARE 
        @lPageNbr INT,
        @lPageSize INT,
        @lSortCol NVARCHAR(20),
        @lFirstRec INT,
        @lLastRec INT,
        @lTotalRows INT

    /*Setting Local Variables*/

    SET @lPageNbr = @PageNo
    SET @lPageSize = @PageSize
    SET @lSortCol = LTRIM(RTRIM(@SortColumn))

    SET @lFirstRec = ( @lPageNbr - 1 ) * @lPageSize
    SET @lLastRec = ( @lPageNbr * @lPageSize + 1 )
    SET @lTotalRows = @lFirstRec - @lLastRec + 1; 

    SELECT ROW_NUMBER() OVER 
        (
            ORDER BY
                CASE WHEN @lSortCol = 'ProductAddedDate' AND @SortOrder='ASC'
                    THEN ProductName
                END ASC,
                CASE WHEN @lSortCol = 'ProductAddedDate' AND @SortOrder='DESC'
                     THEN ProductName
                END DESC,
                 CASE WHEN (@lSortCol = 'Price' AND @SortOrder='ASC')
                          THEN Price
                END ASC,
                CASE WHEN @lSortCol = 'Price' AND @SortOrder='DESC'
                         THEN Price
                END DESC
       ) AS ROWNUM,
        Count(*) over () AS TotalCount, 
        Id as ProductId ,
        ProductName,
        ProductDescription,
        [Price] ,
        [FairName] ,
        [FairDescription] ,
        [StartDate],
        [EndDate]  ,
        [FairLogo] ,
        [ProductAddedDate],
        ProductCategory_Id,
        FairId,
        IsHeroItem,
        ProductSubCategoryId ,
        SubCategoryName,
        MainCategoryName 
    INTO #tmpTable --create a temp table on the fly
    FROM wf_view_Products
    WHERE  
        (@ProductName is NULL OR ProductName like '%'+ @ProductName+ '%') AND 
        (@PostCodes is NULL OR PostCode IN( SELECT CAST(Item AS INTEGER) FROM dbo.SplitString(@PostCodes, ',')))

    SELECT ProductId,
        ROWNUM,
        ProductCategory_Id,
        IsHeroItem,
        ProductName,
        ProductDescription,
        [Price],
        [FairName],
        [FairDescription],
        [StartDate],
        [EndDate],
        [FairLogo],
        [ProductAddedDate],
        FairId
    FROM #tmpTable AS CPC --select from temp table  instead of CTE
    WHERE ROWNUM > @lFirstRec
        AND ROWNUM < @lLastRec
    ORDER BY ROWNUM ASC

    SELECT ProductId
    FROM #tmpTable AS Categories --select from temp table  instead of CTE
    WHERE 1 = 1
END

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SQLクエリを使用して結果セットからその逆のエントリを除外する

分類Dev

既存のSQL結果に対してクエリを実行しますか?SQL結果のサブセットから結果を検索する

分類Dev

SQL:同じクエリからの複数の単一行の結果セットを結合します

分類Dev

'空の結果セットを返す'へのMongoDBクエリ

分類Dev

複数の結果セットを返すクエリ

分類Dev

結果セットを返す必要のないMySQLselectクエリ

分類Dev

サーブレットのクエリ結果からXMLを返す

分類Dev

t-sql2は1つの結果セットをクエリします

分類Dev

SQL Server:わずかに異なる2つのクエリを組み合わせた結果セットを効率的に返す方法

分類Dev

Django - 値のリストから繰り返されるクエリセットの結果のリストを取得する

分類Dev

空白の有無にかかわらず結果を返すSQLクエリ

分類Dev

data.tableクエリが空の結果セットを返すかどうかを確認します

分類Dev

Cosmos DB:空白の結果セットを返すMongoDBソートクエリ

分類Dev

2つのSQLテーブルから単一の結果セットを返します

分類Dev

データベースクエリの結果セットから一意の値を返すメソッドのテスト

分類Dev

複数の基準に基づいて結果セットを返すSQLクエリ

分類Dev

空の結果セットを返すDynamoDBクエリは容量を消費しますか?

分類Dev

SQLは2つのクエリ結果を1つのデータセットに結合します

分類Dev

Javaでクエリの結果セットを返す正しい方法

分類Dev

セッター付きのカスタム結果オブジェクトを返すCodeigniterクエリ結果

分類Dev

PDOクエリは、結果セットの各フィールドを2回返します

分類Dev

2つのテーブルの結果セットから最新の結果を返します

分類Dev

Googleスプレッドシートのクエリ関数データを含むセルから空白の結果を返します

分類Dev

postgresから複数の結果セットを返す:リフレクター、関数、または新機能?

分類Dev

生のクエリ(Sequelize)からGraphQLに結果を返す方法

分類Dev

SQLで2つの異なるクエリの結果セットをマージする

分類Dev

2つのクエリから1つのクエリ結果のみを返す方法

分類Dev

SQLクエリから2番目の結果のみを選択する方法

分類Dev

メインクエリに0行がある場合、サブクエリから結果を生成するMysql結果セットの問題

Related 関連記事

  1. 1

    SQLクエリを使用して結果セットからその逆のエントリを除外する

  2. 2

    既存のSQL結果に対してクエリを実行しますか?SQL結果のサブセットから結果を検索する

  3. 3

    SQL:同じクエリからの複数の単一行の結果セットを結合します

  4. 4

    '空の結果セットを返す'へのMongoDBクエリ

  5. 5

    複数の結果セットを返すクエリ

  6. 6

    結果セットを返す必要のないMySQLselectクエリ

  7. 7

    サーブレットのクエリ結果からXMLを返す

  8. 8

    t-sql2は1つの結果セットをクエリします

  9. 9

    SQL Server:わずかに異なる2つのクエリを組み合わせた結果セットを効率的に返す方法

  10. 10

    Django - 値のリストから繰り返されるクエリセットの結果のリストを取得する

  11. 11

    空白の有無にかかわらず結果を返すSQLクエリ

  12. 12

    data.tableクエリが空の結果セットを返すかどうかを確認します

  13. 13

    Cosmos DB:空白の結果セットを返すMongoDBソートクエリ

  14. 14

    2つのSQLテーブルから単一の結果セットを返します

  15. 15

    データベースクエリの結果セットから一意の値を返すメソッドのテスト

  16. 16

    複数の基準に基づいて結果セットを返すSQLクエリ

  17. 17

    空の結果セットを返すDynamoDBクエリは容量を消費しますか?

  18. 18

    SQLは2つのクエリ結果を1つのデータセットに結合します

  19. 19

    Javaでクエリの結果セットを返す正しい方法

  20. 20

    セッター付きのカスタム結果オブジェクトを返すCodeigniterクエリ結果

  21. 21

    PDOクエリは、結果セットの各フィールドを2回返します

  22. 22

    2つのテーブルの結果セットから最新の結果を返します

  23. 23

    Googleスプレッドシートのクエリ関数データを含むセルから空白の結果を返します

  24. 24

    postgresから複数の結果セットを返す:リフレクター、関数、または新機能?

  25. 25

    生のクエリ(Sequelize)からGraphQLに結果を返す方法

  26. 26

    SQLで2つの異なるクエリの結果セットをマージする

  27. 27

    2つのクエリから1つのクエリ結果のみを返す方法

  28. 28

    SQLクエリから2番目の結果のみを選択する方法

  29. 29

    メインクエリに0行がある場合、サブクエリから結果を生成するMysql結果セットの問題

ホットタグ

アーカイブ