При написании больших запросов зачастую требуется записать в «физическую» таблицу результаты соединения нескольких таблиц. Конечно, сделать это можно (или даже нужно) традиционным способом с применением инструкции create TABLE, но для этого необходимо заранее знать все типы данных в столбцах, прописывать их наименования, что занимает определённое время. Более того, в силу человеческого фактора не исключён риск совершения ошибок, которые приведут к лишним трудозатратам на пересоздание таблицы и потере времени при выполнении запроса.
а не возникает вопроса - нафига пользователю разрешать создавать левую таблицу в sql -сервере?
В каждой организации могут происходить различные процессы по работе с данными, разные условия выполнения задач, где "книжные" классические методы ведения баз данных не работают. Например, когда пользователи самостоятельно анализируют данные и у них своя "песочница", где они создают таблицы, делают выборки и впоследствии удаляют за ненадобностью.
А то что если в первых тысячах строк будет varchar(20) а в следующих varchar (50) и произойдет усечение строк, никто не подумал?
Причём тут первая тысяча, если таблица создаётся по select top 0?
Все столбцы таблицы, указанной в аргументе new_table, получают такие же имена, значения, типы данных и свойства допустимости значений NULL, которые указаны в соответствующем выражении в списке выбора.
Собственно, это одно из преимуществ использования инструкции: https://docs.microsorft.com/ru-ru/sql/t-sql/queries/select-into-clause-transact-sql?view=sql-server-ver15
SELECT col1, ....., col@ —