動的SQLを使用する
declare @tablename sysname = N'ACTIVITY';
declare @sql nvarchar(max);
set @sql = N'delete from Main.dbo.' + quotename(@tablename);
exec sp_executesql @sql;
set @sql = N'insert into Main.dbo.' + quotename(@tablename);
exec sp_executesql @sql;
set @sql = N'select * from Main.dbo.' + quotename(@tablename);
exec sp_executesql @sql;
SQLインジェクションのリスクがあるため、動的SQLを処理するときにQUOTENAMEを使用することは非常に重要です。動的SQLには長所と短所があります。詳細については、動的SQLの呪いと祝福を参照してください。
SSMSとSQLCMDには、クライアント側の変数置換を使用する機能があります。
:setvar tablename Main.dbo.ACTIVITY
delete from $(tablename);
insert into $(tablename);
select * from $(tablename);
SQLCMDモード変数が優れているのは、変数を-v引数を介して渡すことができるため、バッチで使用する場合です。例えば:
c:\>for /f %i in (tablenames.txt) do sqlcmd -S <servername> -E -d <dbname> -v tablename=%i -Q "truncate table $(tablename)"
SSMSでは、SQLCMD実行モードを明示的に有効にする必要があることに注意してください。