2016-11-28 6 views
0

jQueryデータテーブルにCASEを使用して複数のテーブルからデータを取得するためにSQL Serverにストアドプロシージャを作成しています。SQL Server:CTE内でCASEを使用するときにエイリアスを参照する方法 - データテーブルのサーバー側のクエリ

メッセージ207、レベル16、状態1、プロシージャgetAllQuotes、ラインにそれを作成しようとしたとき、私は次のエラーを取得しかし、これは私のクエリ

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROC [dbo].[getAllQuotes] 
    @iDisplayLength int, 
    @iDisplayStart int, 
    @SortCol int, 
    @SortDir nvarchar(10), 
    @Search nvarchar(255), 
    @Status nvarchar(20) = NULL 
AS 
BEGIN 
    Declare @FirstRec int, @LastRec int 

    Set @FirstRec = @iDisplayStart; 
    Set @LastRec = @iDisplayStart + @iDisplayLength; 

    WITH CTE_Quotes as 
    (
     SELECT 
      ROW_NUMBER() OVER (Order by case when (@SortCol = 0 and @SortDir = 'asc') 
               then QuoteID 
             end asc, 
             case when (@SortCol = 0 and @SortDir = 'desc') 
               then QuoteID 
             end desc, 
             case when (@SortCol = 1 and @SortDir = 'asc') 
               then QuoteDateTime 
             end asc, 
             case when (@SortCol = 1 and @SortDir = 'desc') 
               then QuoteDateTime 
             end desc, 
             case when (@SortCol = 2 and @SortDir = 'asc') 
               then CustomerType 
             end asc, 
     case when (@SortCol = 2 and @SortDir='desc') 
      then CustomerType 
     end desc, 
     case when (@SortCol = 3 and @SortDir='asc') 
      then CompanyName 
     end asc, 
     case when (@SortCol = 3 and @SortDir='desc') 
      then CompanyName 
     end desc, 
     case when (@SortCol = 4 and @SortCol='asc') 
      then ContactName 
     end asc, 
     case when (@SortCol = 4 and @SortCol='desc') 
      then ContactName 
     end desc, 
     case when (@SortCol = 5 and @SortCol='asc') 
      then Total 
     end asc, 
     case when (@SortCol = 5 and @SortCol='desc') 
      then Total 
     end desc, 
     case when (@SortCol = 6 and @SortCol='asc') 
      then QuoteBy 
     end asc, 
     case when (@SortCol = 6 and @SortCol='desc') 
      then QuoteBy 
     end desc, 
     case when (@SortCol = 7 and @SortCol='asc') 
      then Status 
     end asc, 
     case when (@SortCol = 7 and @SortCol='desc') 
      then Status 
     end desc 
    ) 
    as RowNum, 
    COUNT(*) over() AS TotalCount, 
    QuoteID, QuoteDateTime, CustomerType = 
    CASE 
     WHEN Flag = 'QuoteDB' THEN 'New Customer' 
     WHEN Flag = 'LiveDB' THEN 'Existing Customer' 
    END , CompanyName = 
    CASE 
     WHEN Flag = 'QuoteDB' THEN (SELECT CompanyName FROM dbo.Quote_Companies QCP WHERE QCP.CompanyID = QT.CompanyID) 
     WHEN Flag = 'LiveDB' THEN (SELECT CompanyName FROM dbo.Companies CP WHERE CP.CompanyID = QT.CompanyID) 
    END, 
    ContactName = 
    CASE 
     WHEN Flag = 'QuoteDB' THEN (SELECT FirstName + ' ' + LastName FROM dbo.Quote_Contacts QCC WHERE QCC.ContactID = QT.ContactID) 
     WHEN Flag = 'LiveDB' THEN (SELECT FirstName + ' ' + LastName FROM dbo.Contacts CT WHERE CT.ContactID = QT.ContactID) 
    END, 
    Total, QuoteBy, Status 
    FROM dbo.QUOTE QT 
    WHERE (@Search IS NULL 
      Or QuoteID LIKE '%' + @Search + '%' 
      or QuoteDateTime LIKE '%' + @Search + '%' 
      or CustomerType LIKE '%' + @Search + '%' 
      or CompanyName LIKE '%' + @Search + '%' 
      or ContactName LIKE '%' + @Search + '%' 
      or Total LIKE '%' + @Search + '%' 
      or QuoteBy LIKE '%' + @Search + '%' 
      or Status LIKE '%' + @Search + '%' 
    ) 
    AND Status = @Status 
) 
SELECT * 
FROM CTE_Quotes 
WHERE RowNum > @FirstRec AND RowNum < @LastRec 

エンド

です94
無効な列名 'CustomerType'です。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行95
無効な列名 'CompanyName'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行96
無効な列名 'ContactName'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行37
無効な列名 'CustomerType'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行40
無効な列名 'CustomerType'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行43
無効な列名 'CompanyName'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行46
無効な列名 'CompanyName'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行49
無効な列名 'ContactName'。

メッセージレベル16、状態1、プロシージャgetAllQuotes、行52
無効な列名 'ContactName'。

誰でも私がこれらのエラーを修正する方法について教えてください。

エイリアスの参照方法についてはわかりません。

おかげ

答えて

0

は仕入や他の表現を紹介するcross applyを使用して、あなたは他の句からそれらを参照できるようになります。

SQL Server 2012以降では、結果をページングするためにcteでrow_number()を使用する必要はありません。 order by句でcase文全体を使用してoffset-fetchを使用できます。

+0

ありがとうございます。私はその文書を読むつもりですが、その背後にある論理をいくらか理解することはできますが、私は自分のコードをまだ一貫したものにすることはできません。 – Saj

+0

私は関数を実行することができましたが、結果は出てきますが、前には得られなかったエラーが発生します。プロシージャーまたは関数 'getAllQuotes'は、提供されなかったパラメーター '@Search'を要求します。 @Searchが空白の場合は、すべてのレコードを返すだけです – Saj

+0

私はそれを解決しました。あなたの指導をありがとう – Saj

関連する問題