2

私はかなりの数の一時テーブルを利用stored procedureSQL Server 2008ています(別のコードをリファクタリングしていて、これらをスカラーに移動しようとしていますが、それはより長いプロセスです)。ストアド プロシージャの開始時に、すべての一時テーブルを宣言し、それらをループ処理して、存在する一時テーブルを削除します。

他のプログラミング言語 ( など) を使用すると、変数を作成してループするpythonことができます。for loopでこれを行うことができますSQL Serverか? WHILE使用する正しい関数のように思えますが、私が見たすべての例では、 などの増分値を使用していますSET @intFlag = @intFlag + 1。私はインクリメントしようとしているのではなく、値を取得して一時テーブルが存在するかどうかを確認します-存在する場合は削除します。そうでない場合は、次の値。

これが私が想像したものですが、次に何をすべきか、プログラムでテーブルを削除することさえ可能かどうかはわかりません:

DECLARE @Tables table (tablename varchar(50));
INSERT INTO @Tables VALUES 
    ('#a'),
    ('#b'),
    ('#c'),
    ('#d');

-- this part is how I would write the code in python -- 

for i in @Tables:
IF OBJECT_ID('tempdb..+ i ') IS NOT NULL
    DROP TABLE i

私の中でこれを達成する方法はありstored procedureますか?

4

2 に答える 2

0

カーソルなしのこのループ。
テーブル変数にIDENTITY列を追加するだけです

DECLARE @Tables table (Id int IDENTITY, tablename varchar(50)
INSERT INTO @Tables VALUES
    ('#a'),
    ('#b'),
    ('#c'),
    ('#d');

DECLARE @Id int = (SELECT MIN(Id) FROM @Tables),
        @dsql nvarchar(max)
WHILE (@Id IS NOT NULL)
BEGIN 
  SELECT @dsql = 'IF OBJECT_ID(''tempdb.dbo.' + tablename + ''') IS NOT NULL DROP TABLE ' + tablename
  FROM @Tables
  WHERE Id = @Id
  EXEC sp_executesql @dsql
SELECT @Id = MIN(Id) FROM @Tables WHERE Id > @Id
END
于 2012-12-04T08:20:59.993 に答える
0

そのためにカーソルを使用したい場合があります。次に例を示します。

DECLARE @tablename nvarchar(50)
DECLARE table_cursor CURSOR FOR 
SELECT tablename
FROM @Tables;

OPEN table_cursor

FETCH NEXT FROM table_cursor 
INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @tablename
            -- Your DROP TABLE code goes here

    FETCH NEXT FROM table_cursor 
    INTO @tablename
END 
CLOSE table_cursor;
DEALLOCATE table_cursor;
于 2012-12-03T20:39:44.880 に答える