如何获取存储过程中创建的临时表的列表?

时间:2017-01-03 17:13:33

标签: sql sql-server tsql stored-procedures temp-tables

我有一个存储过程,我在其中创建了几个临时表。如何获取在该存储过程中创建的临时表的列表?

这样的事情:

SELECT [# temporary table name]
FROM sys.procedures
WHERE name = '<Stored Procedure Name>'

我想要这个结果

Temporary_Table_Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#TemporaryTable1
#TemporaryTable2
.
.
.
#TemporaryTableN

(N row(s) affected)

然后,使用该列表,我想动态地构建DROP TABLE指令。

    Dinamic_DROP_Instruction
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
IF OBJECT_ID('tempdb..#TemporaryTable1') IS NOT NULL DROP TABLE #TemporaryTable1
IF OBJECT_ID('tempdb..#TemporaryTable2') IS NOT NULL DROP TABLE #TemporaryTable1
.
.
.
IF OBJECT_ID('tempdb..#TemporaryTableN') IS NOT NULL DROP TABLE #TemporaryTableN

(N row(s) affected)

2 个答案:

答案 0 :(得分:1)

我能够构造一个代码来获取临时表列表,并设置动态指令来DROP每个临时表(如果存在)。

我留下代码和我所在的来源的链接。

<强> CODE:

class foo
{
public:
    bar steal_the_moveable_object()
    {
        return std::move(moveable_object);
    }
private:
    bar moveable_object;
};

答案 1 :(得分:0)

评论太久......

这并不容易,并且可能需要解析功能。首先,使用OBJECT_DEFINITIONsp_helptext或查看sys.sql_modules或您希望获得定义的其他方法。然后你将不得不根据#或你想要的其他方法搜索你的临时表,并拆分它们。这将是非常混乱和容易出错恕我直言。这是一个开始。

 SELECT 
    SUBSTRING(
            OBJECT_DEFINITION(OBJECT_ID('yourProcedure')),
            CHARINDEX('#',OBJECT_DEFINITION(OBJECT_ID('yourProcedure'))),
            60)

60这里只是一个编号。你想在#或类似之后找到第一个空白区域。同样,我认为除了在您的程序中使用CONTROL+F并手动添加DROP语句之外,还有一种快速的方法...