Seperti yang disarankan Martin dalam komentar di bawah pertanyaan, masalahnya adalah bahwa server SQL tidak menekan predikat dengan benar dari klausa WHERE - lihat tautan di komentarnya.
Saya akhirnya membuat fungsi bernilai tabel yang ditentukan pengguna dan menggunakannya dengan operator CROSS APPLY untuk membuat tampilan.
Mari kita lihat solusinya sendiri.
Fungsi Nilai Tabel Buatan Pengguna
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
)
Lihat
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
Test AS t
CROSS APPLY TestFunction(Id) as f
Kueri dengan konstanta
SELECT * FROM TestView WHERE Id = 69
Kueri dengan parameter
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id
Kueri dengan parmater pada dasarnya dieksekusi secepat kueri dengan konstanta.
Terima kasih Martin dan untuk yang lainnya juga!