Detta beror på att omfattningen av EXEC uttalandet skiljer sig från omfattningen av den innehållande sproc. Det vill säga ditt anrop till EXEC skapar den temporära tabellen, och sedan tas den automatiskt bort som räckvidd för EXEC finns kvar. Du måste i princip göra allt i ett EXEC uttalande:
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
INSERT INTO #temp ...'
EXEC(@sql)