小编典典

如何在sql中定义变量而不是表名?

sql

我有这个SQL查询:

delete from Main.dbo.ACTIVITY;
insert into Main.dbo.ACTIVITY
select * from MainTemp.dbo.ACTIVITY;

我想在执行完之后在10个表中执行该SQL ACTIVITY

有什么办法吗?定义变量或其他内容?

我正在SQL Server Management Studio 10(= SQL Server 2008)中运行查询


阅读 200

收藏
2021-04-07

共1个答案

小编典典

使用动态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;

这是 非常 使用的重要QUOTENAME处理,因为SQL注入风险的动态SQL时。动态SQL具有优缺点,

使用SQLCMD执行模式

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执行模式。

2021-04-07