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

您可能希望为此使用游标,例如:

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 回答
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 回答