NOLOCK для «внешнего» запроса также применяется к любым внутренним запросам. CTE - это просто макрос, подобный представлению или встроенной таблице udf: ни больше, ни меньше. Таким образом, вы на самом деле (игнорируя подсказки NOLOCK)
select * from (
select * from (
select * from tab1
) t1
) t2
С Таблица Советы по MSDN , в разделе «Примечания»
Все подсказки блокировки распространяются на все таблицы и представления, к которым обращается план запроса, включая таблицы и представления, на которые имеются ссылки в представлении.
В этом случае вам нужен только один. Не важно где.
Где это имеет значение, там, где у вас есть СОЕДИНЕНИЯ. Если бы cte1 был объединением 2 таблиц, он понадобился бы для каждой таблицы. Или укажите это один раз на более высоком / внешнем уровне.
О, и я присоединюсь ко всем остальным: NOLOCK - плохая идея