(1) Insert into a HEAP is minimally logged under TABLOCK but fully logged without TABLOCK. This is one of the features that customers have been asking for. By the way, the only drawback is that it holds X lock, unlike Bulk Insert which holds BU lock, so you cannot insert using multiple threads.
-- create the source table
create table t_source (c1 int, c2 int, c3 char (100), c4 char(1000))
go
declare @i int
select @i = 1
while (@i < 1000)
begin
insert into t_source values (@i, @i+10000, 'indexkey', 'hello')
select @i= @i + 1
end
-- create the target heap
create table t_heap (c1 int, c2 int, c3 char(100), c4 char(1000))
go
-- this is minimally logged.
-- LOCK: X lock on the table
-- this behavior is same even when ‘t_heap’ is not empty
begin tran
insert into t_heap with (TABLOCK) select * from t_source
-- here are the top-10 log records. You can see that it is minimally logged