1

我有这个 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) 中运行查询

4

2 回答 2

6

在这种情况下编写动态查询。下面的例子可能会给你一些想法

例如

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
于 2012-11-14T08:03:43.250 回答
4

使用动态 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 的诅咒和祝福

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

于 2012-11-14T08:10:14.500 回答