You can't use dynamic SQL to insert into a table variable in the outer block, it has to be a temp table, you need to put the "INSERT INTO #RESULTS" in the @CMD variable, and your @CMD statement must do a SELECT, not a PRINT. So you want
DECLARE @col nvarchar(255), @cmd nvarchar(max)
Create Table #Results (ResultText VARCHAR(500));
set nocount on
DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = N'Map'
OPEN getinfo
FETCH NEXT FROM getinfo into @col
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM Map WHERE [' + @col + '] IS NOT NULL) BEGIN INSERT INTO #Results select ''' + @col + ''' end'
EXEC SP_EXECUTESQL @cmd
FETCH NEXT FROM getinfo into @col
END
CLOSE getinfo
DEALLOCATE getinfo
select * from #Results
Tom