2017-02-08 9 views
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'. 

答えて

2

は、なぜあなたはちょうどSelectでそれを使用してcross applyに一人でテーブル値関数を使用しcross applyscalar機能を置きます。 (影響を受けた1行(複数可))についてこの

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 

のようなものは、あなたが実行計画を有効にしていますか?

あなたが派生テーブルを使用するか、CROSS APPLY

SELECT t.ID, 
     t.[Date], 
     t.[Text], 
     t.Points, 
     cs.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 
     cross apply (select dbo.Fncalcdistancekm(t.Latitude, @Latitude, t.Longtitude, @Longtitude))cs (Distance) 
WHERE t.CountryCode = @CountryCode 
     AND cs.Distance < @DistanceInKm 
ORDER BY t.Date DESC 
OFFSET @Offset ROWS FETCH NEXT 20 ROWS ONLY 
+0

クールで一人でその機能を使用することができますいずれか二回、関数を使用したくない場合は、感謝します。関数HasVotedIsUpvoteは2つの列を返し、それらを両方とも必要とします。私はちょうど入力する必要があります: func.HasVotedIsUpvote.FirstColumnとfunc.HasVotedIsUpvote.SecondColumn選択? –

+0

@TarekOrfaliそれだけです。関数名だけを削除します.func.FirstColumn'と 'func.SecondColumn' –

+0

もう一度お世話になりましたが、私はあなたに教えてくれた変更を加えましたが、今はエラーが発生します。 ここに新しいストアドプロシージャがあります:http://pastebin.com/vy7HD9Gd そして、私が得たエラーをheres:http://pastebin.com/UP6pffFs –

関連する問題