Zoals Martin in een opmerking onder de vraag suggereerde, is het probleem dat SQL-server het predikaat van de WHERE-clausule niet goed naar beneden duwt - zie de link in zijn opmerking.
Uiteindelijk heb ik een door de gebruiker gedefinieerde tabelwaardefunctie gemaakt en deze gebruikt met de CROSS APPLY-operator voor het maken van de weergave.
Laten we de oplossing zelf bekijken.
Door gebruiker gedefinieerde functie met tabelwaarde
CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
RETURNS TABLE
AS
RETURN
(
WITH
Hierarchy (Id, ParentId, Data, Depth)
AS(
SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
UNION ALL
SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
FROM Hierarchy h
INNER JOIN Test t ON t.Id = h.ParentId
)
SELECT * FROM Hierarchy
)
Bekijken
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
Test AS t
CROSS APPLY TestFunction(Id) as f
Query met constante
SELECT * FROM TestView WHERE Id = 69
Query met parameter
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id
De query met de parameter wordt in principe net zo snel uitgevoerd als de query met de constante.
Bedankt Martin en ook voor de anderen!