Похоже, что вы пытаетесь написать один запрос для двух сценариев:
1. @filter = "x, y, z"
2. @filter IS NULL
Чтобы оптимизировать сценарий 2, я бы использовал INNER JOIN для UDF, а не использовал предложение IN ...
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
Чтобы оптимизировать сценарий 2, я НЕ пытался бы адаптировать существующий запрос, вместо этого я намеренно оставил бы эти случаи раздельными, либо оператор IF, либо UNION, и моделировал бы IF с помощью предложения WHERE ...
TSQL IF
IF (@filter IS NULL)
SELECT * FROM table
ELSE
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
СОЮЗ для имитации IF
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
UNION ALL
SELECT * FROM table WHERE @filter IS NULL
Преимущество таких конструкций в том, что каждый случай прост, и определение того, что просто, само по себе просто. Однако их объединение в один запрос приводит к таким компромиссам, как ЛЕВЫЕ СОЕДИНЕНИЯ, что приводит к значительным потерям производительности для каждого.