;with a(n) as (select 1 union all select 0 union all select 0),b(n) as (select 0 from a cross join a b),c(Date) as (select DateAdd(day, ROW_NUMBER() over (order by n), @inp_dt) from b )select top 1 * from c cwhere DATENAME(dw,c.date) not in ('Saturday','Sunday')and not exists(select * from Holidays where Holiday_Dt = c.Date)

;with a(n) as (select 1 union all select n+1 from a where n<7),d(Date) as (select DateAdd(day, n, @inp_dt) from a )select top 1 * from d dwhere DATENAME(dw,d.date) not in ('Saturday','Sunday')and not exists(select * from Holidays where Holiday_Dt = d.Date)

Both have simpler plans but their execution times are the same or slightly worse than Milan's, at least on my server.

One nice suggestion is to use the CTE in a view definition for generic numbers, and possibly add generic dates as well, and then this query (and others like it) are simple SELECTs against that view.