web-dev-qa-db-ja.com

マルチパート識別子「xxx」をバインドできませんでした

以下は、他の開発者(外部)から継承した非常に大きなストアドプロシージャの小さな部分のHAVING句です。

HAVING (SELECT COUNT(*) FROM
(
    SELECT *
    FROM dbo.ContractDailyRoomAllocation da2
    WHERE da2.ContractId = DA.ContractId
    AND da2.RoomTypeId = DA.RoomTypeId
    AND da2.Date >= @FromDate AND da2.Date < @ToDate
    AND da2.IsSold = 0
    AND da2.ReleaseDay <= DATEDIFF("d", @TodayDate, da2.Date)) T) = @StayDates
    AND ( (@AllowOnRequestBookings = 'False' 
      OR dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate)  
      >= 0 ) )
      AND ( (@AllowOnRequestBookings = 'True' 
      OR dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate) 
      > 0 )
)

最後の2つのANDは、次のエラーメッセージを表示します。

メッセージ4104、レベル16、状態1、プロシージャGetAvailableHotelRooms、行176
マルチパート識別子「da2.ContractId」をバインドできませんでした。
メッセージ4104、レベル16、状態1、プロシージャGetAvailableHotelRooms、行176
マルチパート識別子「da2.RoomTypeId」をバインドできませんでした。
メッセージ4104、レベル16、状態1、プロシージャGetAvailableHotelRooms、行177
マルチパート識別子「da2.ContractId」をバインドできませんでした。
メッセージ4104、レベル16、状態1、プロシージャGetAvailableHotelRooms、行177
マルチパート識別子「da2.RoomTypeId」をバインドできませんでした。

何か案は?

2
Matt

コードを再フォーマットすると問題が発生します。私が変更したのは空白であり、コメントを追加しました:

HAVING
    (
        SELECT COUNT(*) FROM
        (
            SELECT *
            FROM dbo.ContractDailyRoomAllocation da2 -- <-- da2 defined here
            WHERE da2.ContractId = DA.ContractId
            AND da2.RoomTypeId = DA.RoomTypeId
            AND da2.Date >= @FromDate AND da2.Date < @ToDate
            AND da2.IsSold = 0
            AND da2.ReleaseDay <= DATEDIFF("d", @TodayDate, da2.Date)
        ) T
    ) = @StayDates
AND
    ( 
        (
            @AllowOnRequestBookings = 'False' OR
            dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate) >= 0

        )
    )
AND 
    (
        (
            @AllowOnRequestBookings = 'True' OR
            dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate) > 0
        )
    )

簡単にわかるように、da2は、サブクエリでfirstANDd用語で定義されているエイリアスであるため、他の用語では使用できません。

ここで2番目と3番目のANDd項を移動したい場合がありますintoサブクエリ、またはそれよりも複雑な場合があります。

4
AakashM

エイリアスda2をサブクエリ内で宣言しました
その後、認識されないそのサブクエリの外部で参照しました。

テーブルAND(カウントされるレコード)のフィルターとして「最後の2つのT 's」が必要な場合、
次に、代わりにこれを使用してみてください:

HAVING 
    (SELECT COUNT(*)
    FROM dbo.ContractDailyRoomAllocation da2
    WHERE da2.ContractId = DA.ContractId
        AND da2.RoomTypeId = DA.RoomTypeId
        AND da2.Date >= @FromDate AND da2.Date < @ToDate
        AND da2.IsSold = 0
        AND da2.ReleaseDay <= DATEDIFF("d", @TodayDate, da2.Date
        AND ( @AllowOnRequestBookings = 'False' OR dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate) >= 0 )
        AND ( @AllowOnRequestBookings = 'True' OR dbo.GetAvailablePackageRoomCount(da2.ContractId,da2.RoomTypeId,@FromDate,@ToDate) > 0 )
    ) = @StayDates

それがあなたが期待しているデータであることを確認してください、
それが必要なものかどうかを教えてください。

רועיגביש

3
Roi Gavish