T-SQL には、テーブル名などを格納するための型SYSNAMEがあります。
sysname データ型は、テーブルの列、変数、およびオブジェクト名を格納するストアド プロシージャ パラメータに使用されます。sysname の正確な定義は、識別子の規則に関連しています。したがって、SQL Server のインスタンス間で異なる場合があります。sysname は機能的には nvarchar(128) と同じですが、デフォルトでは sysname は NOT NULL です。以前のバージョンの SQL Server では、sysname は varchar(30) として定義されています。
したがって、次のように変数を宣言してみてください。
DECLARE @tableName SYSNAME;
VARCHAR(100)
他の回答で示唆されているように、テーブル名に現在のコードページ外の文字が含まれているか、100文字を超えている場合、宣言を使用すると失敗します。
識別子に関する SQL Server の規則からの抜粋は、テーブル名の形式を説明しています。
最初の文字は、次のいずれかでなければなりません。
Unicode 標準 3.2 で定義されている文字。文字の Unicode 定義には、a ~ z、A ~ Z のラテン文字、および他の言語の文字が含まれます。
アンダースコア (_)、アットマーク (@)、または番号記号 (#)。
識別子の先頭にある特定の記号は、SQL Server で特別な意味を持ちます。アットマークで始まる通常の識別子は、常にローカル変数またはパラメーターを示し、他のタイプのオブジェクトの名前として使用することはできません。番号記号で始まる識別子は、一時テーブルまたはプロシージャを示します。2 つの番号記号 (##) で始まる識別子は、グローバル一時オブジェクトを示します。番号記号または 2 つの番号記号文字を使用して、他の種類のオブジェクトの名前を開始することもできますが、この方法はお勧めしません。
一部の Transact-SQL 関数には、二重アットマーク (@@) で始まる名前が付いています。これらの関数との混同を避けるために、@@ で始まる名前は使用しないでください。
後続の文字には、次のものを含めることができます。
Unicode 標準 3.2 で定義されている文字。
基本ラテン文字またはその他の国別文字の 10 進数。
アットマーク、ドル記号 ($)、番号記号、またはアンダースコア。
識別子は、Transact-SQL 予約語であってはなりません。SQL Server では、予約語の大文字バージョンと小文字バージョンの両方が予約されています。
埋め込みスペースまたは特殊文字は使用できません。
補助文字は使用できません。
詳細については、私の回答のドキュメント リンクを参照してください。