Như Martin đã đề xuất trong một bình luận dưới câu hỏi, vấn đề là máy chủ SQL không đẩy đúng vị ngữ từ mệnh đề WHERE - hãy xem liên kết trong bình luận của anh ấy.
Tôi đã kết thúc với việc tạo một hàm có giá trị bảng do người dùng xác định và sử dụng nó với toán tử ÁP DỤNG CHÉO để tạo chế độ xem.
Hãy xem giải pháp của chính nó.
Hàm có giá trị trong bảng do người dùng xác định
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
)
Xem
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
Test AS t
CROSS APPLY TestFunction(Id) as f
Truy vấn với hằng số
SELECT * FROM TestView WHERE Id = 69
Truy vấn với tham số
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id
Truy vấn với parmater thực thi về cơ bản nhanh như truy vấn với hằng số.
Cảm ơn Martin và những người khác nữa!