以下は、他の開発者(外部)から継承した非常に大きなストアドプロシージャの小さな部分の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」をバインドできませんでした。
何か案は?
コードを再フォーマットすると問題が発生します。私が変更したのは空白であり、コメントを追加しました:
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
は、サブクエリでfirstAND
d用語で定義されているエイリアスであるため、他の用語では使用できません。
ここで2番目と3番目のAND
d項を移動したい場合がありますintoサブクエリ、またはそれよりも複雑な場合があります。
エイリアス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
それがあなたが期待しているデータであることを確認してください、
それが必要なものかどうかを教えてください。
רועיגביש