1

私はこの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)でクエリを実行しています

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 に答える