Zrozumiałem, że niektóre wersje Microsoft OLE DB Provider dla SQL Server (głównie w systemie Windows XP) nie obsługują oświadczenia WITH
. Postanowiłem więc przenieść instrukcję SQL do funkcji o wartości tabelarycznej i wywołać ją z mojej aplikacji. Teraz utknąłem. Jak powinienem użyć oświadczenia INSERT INTO
z WITH
? Oto kod mam pochodzą z tak daleko, ale SQL Server nie podoba ... :-(Jak używać instrukcji CTE w funkcji zwracającej tabelę w SQL Server
CREATE FUNCTION GetDistributionTable
(
@IntID int,
@TestID int,
@DateFrom datetime,
@DateTo datetime
)
RETURNS
@Table_Var TABLE
(
[Count] int,
Result float
)
AS
BEGIN
INSERT INTO @Table_Var ([Count], Result) WITH T(Result)
AS (SELECT ROUND(Result - AVG(Result) OVER(), 1)
FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo)
SELECT COUNT(*) AS [Count],
Result
FROM T
GROUP BY Result
RETURN
END
GO
Jeśli CTE jest rekurencyjne pewnie wygrał nie będzie w stanie przepisać go do postaci podkwerendy, więc forma CTE może być czymś więcej niż tylko kwestią gustu. Oczywiście, rekurencyjne CTE mogą wyłączyć optymalizator, jeśli nie jesteś ostrożny: –
MattW
Tak używane do używania ';' przed częścią z cte. – JJS