Dropping a table with a non-printable character in its name

Since you already know which character is hidden, you can easily construct the current name using a variable, pass that into sp_rename, and then drop the table using the newly acquired name:

DECLARE @t nvarchar(128) = N'dbo.Table' + NCHAR(31) + N'_Name';
EXEC sys.sp_rename @t, N'NewTableName', N'OBJECT';
DROP TABLE dbo.NewTableName;

(Always be careful about using the proper schema identifier.)

Even easier would be to take your string that you know has the character in it, and wrap it in square brackets. This worked for me just fine:

DROP TABLE dbo.[Table_Name];
---------------------^
-- There is an NCHAR(31) right before the underscore

If you didn't know the trouble character(s), you could pull the name from the catalog view, identifying it by surrounding characters, then loop through the characters to determine which are problematic. Here's a full repro:

USE tempdb;
GO

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE TABLE dbo.[Table' + NCHAR(31) + N'_Name](ID INT);';
EXEC sys.sp_executesql @sql;
GO

DECLARE @var NVARCHAR(128);
SELECT @var = name 
  FROM sys.tables 
  WHERE name LIKE N'Table%Name';

-- is it the right one?
PRINT @var;

DECLARE @i INT;
SET @i = 1;
WHILE @i <= LEN(@var)
BEGIN
  PRINT SUBSTRING(@var, @i, 1) + N' => ' + RTRIM(UNICODE(SUBSTRING(@var, @i, 1)));
  SET @i = @i + 1;
END

Results:

Table_Name
T => 84
a => 97
b => 98
l => 108
e => 101
 => 31
_ => 95
N => 78
a => 97
m => 109
e => 101

And then don't forget to chide or smack the person responsible for a table getting into the system that way in the first place, if they're still employed in the industry.