1
私のストアドプロシージャは、select関数内でいくつかの関数を実行するためにクロス適用を使用します。 3つの関数はスカラ値であり、最後の関数はテーブル値です。スカラー値関数とテーブル値関数の両方にクロス適用
ALTER PROCEDURE [dbo].[GetThreadsInArea]
@CountryCode nvarchar(10),
@Latitude float,
@Longtitude float,
@DistanceInKm int,
@Offset int,
@UserID int
AS
BEGIN
SELECT t.ID, t.[Date], t.[Text], t.Points, func.Distance, func.Messages, t.Color, func.IsOwnThread, func.HasVotedIsUpvote
FROM dbo.Threads as t
CROSS APPLY
(Select
dbo.fnCalcDistanceKM(t.Latitude, @Latitude, t.Longtitude, @Longtitude) as Distance, -- Scalar-valued
dbo.GetThreadCommentCount(t.ID) as [Messages], -- Scalar-valued
dbo.IsOwnThread(t.ID, @UserID) as IsOwnThread, -- Scalar-valued
dbo.HasVotedIsUpvote(t.ID, @UserID) as HasVotedIsUpvote -- Table-valued
) as func
WHERE t.CountryCode = @CountryCode AND func.Distance < @DistanceInKm
ORDER BY t.Date desc
OFFSET @Offset ROWS
FETCH NEXT 20 ROWS ONLY
END
このコマンドがうまく完了しますが、私はそれを実行してみたときに、私が取得:
Msg 4121, Level 16, State 1, Procedure dbo.GetThreadsInArea, Line 10 [Batch Start Line 0]
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.HasVotedIsUpvote", or the name is ambiguous.
(1 row(s) affected)
影響を受けた1行も私を混乱させる。ストアドプロシージャは、どの行のデータも変更しないでください。それは影響を受けたテーブル値関数から返される行ですか?
EDIT:
だから、これは私がSELECTでとWHEREの両方で、二回dbo.fnCalcDistanceKMを使用する必要が嫌いけれども手順は、今どのように見えるかです。これに対する解決策はありますか?
ALTER PROCEDURE [dbo].[GetThreadsInArea]
@CountryCode nvarchar(10),
@Latitude float,
@Longtitude float,
@DistanceInKm int,
@Offset int,
@UserID int
AS
BEGIN
SELECT t.ID,
t.[Date],
t.[Text],
t.Points,
**dbo.Fncalcdistancekm(t.Latitude, @Latitude, t.Longtitude, @Longtitude)** AS Distance,
dbo.Getthreadcommentcount(t.ID) AS [Messages],
t.Color,
dbo.Isownthread(t.ID, @UserID) AS IsOwnThread,
func.HasVoted,
func.IsUpvote
FROM dbo.Threads AS t
CROSS APPLY dbo.Hasvotedisupvote(t.ID, @UserID) func
WHERE t.CountryCode = @CountryCode
AND **dbo.Fncalcdistancekm(t.Latitude, @Latitude, t.Longtitude, @Longtitude)** < @DistanceInKm
ORDER BY t.Date DESC
OFFSET @Offset ROWS
FETCH NEXT 20 ROWS ONLY
END
は、私は、その別名の距離を使用してみましたが、それはちょうど私に語った:
Msg 207, Level 16, State 1, Procedure GetThreadsInArea, Line 22 [Batch Start Line 7]
Invalid column name 'Distance'.
クールで一人でその機能を使用することができますいずれか二回、関数を使用したくない場合は、感謝します。関数HasVotedIsUpvoteは2つの列を返し、それらを両方とも必要とします。私はちょうど入力する必要があります: func.HasVotedIsUpvote.FirstColumnとfunc.HasVotedIsUpvote.SecondColumn選択? –
@TarekOrfaliそれだけです。関数名だけを削除します.func.FirstColumn'と 'func.SecondColumn' –
もう一度お世話になりましたが、私はあなたに教えてくれた変更を加えましたが、今はエラーが発生します。 ここに新しいストアドプロシージャがあります:http://pastebin.com/vy7HD9Gd そして、私が得たエラーをheres:http://pastebin.com/UP6pffFs –