我有以下腳本來改變我的本地編譯函數。我希望它返回一個表。我也正在從單一聲明變成多聲明。所以我將returns
更改爲begin atomic
。在SQL Server 2016中使用本地編譯修改表值函數時出錯
ALTER FUNCTION [dbo].[MovieSimularity]
(
@movieID int
)
RETURNS @result Table (movieID int, distance int)
WITH Native_Compilation, SCHEMABINDING
as
Begin ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')
--begin
declare @m int
declare @countZero int
declare @r Table (movieID int, distance int)
declare cur cursor local for
select movieID
from dbo.Movies
where movieID != @movieID and dbo.CompareMovieHashes(@movieID, movieID) = 1
open cur
fetch next from cur into @m
while @@FETCH_STATUS = 0
begin
insert into @r
select @m, dbo.MovieEuclideanDistance(@movieID,@m) as distance
set @countZero = (select count(*) from @r where distance = 0)
if(@countZero > 5)
break
fetch next from cur into @m
end
close cur
deallocate cur
return
select top(5) *
from @r
order by distance
end
執行給了我以下錯誤:
Msg 487, Level 16, State 1, Procedure MovieSimularity, Line 12 [Batch Start Line 7]
An invalid option was specified for the statement "CREATE/ALTER FUNCTION".
Msg 319, Level 15, State 1, Procedure MovieSimularity, Line 13 [Batch Start Line 7]
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Procedure MovieSimularity, Line 44 [Batch Start Line 7]
Incorrect syntax near 'end'.
我不知道是什麼問題。請幫助
使用*光標*的TVF有什麼意義?沒有什麼比遊標慢。試圖本地編譯它不會讓它更快。你想做什麼?不管它是什麼,有更簡單快捷的方式來使用查詢 –
例如,兩個遊標本質上是一個'INSERT SELECT FROM'。歐幾里德距離 - 這聽起來像一個空間函數(提示)。查找前5個匹配只需要'SELECT'中的'TOP 5'子句或'ROW_NUMBER()'來計算最多5個行號 –
@Panagiotiskanavos非常感謝。我不知道慢光標。我不想使用前5名,因爲我使用了order by,我的最小值爲零,所以我不想計算所有的歐幾里德距離。當它發現五個零就足夠了。 –