Điều này là do phạm vi của EXEC câu lệnh khác với phạm vi của mầm có chứa. Đó là, cuộc gọi của bạn tới EXEC đang tạo bảng tạm thời và sau đó nó sẽ tự động được bỏ làm phạm vi cho EXEC còn lại. Về cơ bản, bạn phải thực hiện toàn bộ bên trong một EXEC tuyên bố:
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
INSERT INTO #temp ...'
EXEC(@sql)