非常に奇妙なサーバーの動作に遭遇しました-つまり:
以下のように、1 つの TVP 引数で TVF を取得しました
CREATE FUNCTION [BUD].[Foo] (@IdAgrs IdTable READONLY)
RETURNS TABLE
AS
RETURN
(
WITH recursive_CTE
AS
(
--> Select here is not important - only that TVP join goes here:
SELECT Id, IdParent, Number, 1 as 'lvl'
FROM Agreements ag
join @IdAgrs ig on ig.Id = ag.Id --> HERE
UNION ALL
SELECT a.Id, a.IdParent, a.Number
i.lvl + 1
FROM Agreements e
INNER JOIN recursive_CTE r ON e.IdParent = r.Id
)
select 1
from recursive_CTE
)
TVP は次のとおりです。
IF NOT EXISTS (select 1 from sys.table_types where name = 'IdTable')
CREATE TYPE IdTable AS TABLE (Id INT NOT NULL)
今、「奇妙な」部分:
エクスプレス サーバー バージョンで機能を実行しようとすると、フリーズします。つまり、実行時間は非常に長い (4 分間待機した後に実行をキャンセルする) のに対して、フル バージョンでは問題なく実行されます (0 - データはまったくありません)。どちらも2008R2、同じDB、同じTVF、同じTVPです。以下のように TVF を実行
declare @IdAgrs IdTable
insert into @IdAgrs values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
select * from BUD.Foo(@IdAgrs)
しかし!
TVF の本体を単独で実行すると、魅力的に動作します (WTF?)
declare @IdAgrs IdTable
insert into @IdAgrs values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
;WITH recursive_CTE
AS
(
--> Select here is not important - only that TVP join goes here:
SELECT Id, IdParent, Number, 1 as 'lvl'
FROM Agreements ag
join @IdAgrs ig on ig.Id = ag.Id --> HERE
UNION ALL
SELECT a.Id, a.IdParent, a.Number
i.lvl + 1
FROM Agreements e
INNER JOIN recursive_CTE r ON e.IdParent = r.Id
)
select 1
from recursive_CTE
理由がわからない!? Express Edition にはいくつかの制限がありますか?