我有这个 SQL 查询:
delete from Main.dbo.ACTIVITY;
insert into Main.dbo.ACTIVITY
select * from MainTemp.dbo.ACTIVITY;
我想在执行 for 之后为 10 个表执行该 SQL ACTIVITY
。
有没有办法做到这一点?定义一个变量还是什么?
我在 SQL Server Management Studio 10 (= SQL Server 2008) 中运行查询
我有这个 SQL 查询:
delete from Main.dbo.ACTIVITY;
insert into Main.dbo.ACTIVITY
select * from MainTemp.dbo.ACTIVITY;
我想在执行 for 之后为 10 个表执行该 SQL ACTIVITY
。
有没有办法做到这一点?定义一个变量还是什么?
我在 SQL Server Management Studio 10 (= SQL Server 2008) 中运行查询
在这种情况下编写动态查询。下面的例子可能会给你一些想法
例如
Declare @tableNames table(Id int identity,TableNames Varchar(10))
Insert Into @tableNames Values('Table1'),('Table2'),('Table3'),('Table4')
Declare @query AS Varchar(max)
Declare @tblNames AS Varchar(max)
Declare @count AS int
Declare @i AS int = 1
Select @count = Count(*) from @tableNames
While(@i <=@count)
Begin
Select @tblNames = TableNames from @tableNames Where Id = @i
Set @query = 'delete from ' + @tblNames
Set @query += '; insert into ' + @tblNames
Set @query += '; select * from ' + @tblNames
print @query --exec @query
Set @i += 1
End
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 执行模式。