获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表

Posted

技术标签:

【中文标题】获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表【英文标题】:Get structure of temp table (like generate sql script) and clear temp table for current instance 【发布时间】:2012-02-17 02:01:59 【问题描述】:

如何获取临时表的结构然后删除临时表。临时表有 sp_helptext 吗?最后是否可以在同一会话或查询窗口中删除临时表? 示例:

select *
into #myTempTable  -- creates a new temp table
from tMyTable  -- some table in your database

tempdb..sp_help #myTempTable

Reference.

【问题讨论】:

在 Sql Server 中使用 CTE 似乎会自动删除临时表:technet.microsoft.com/en-us/library/… 红移需要这样做 【参考方案1】:

只要我知道表格没有 SP_HelpText。 试试这个:

Select * From tempdb.sys.columns Where object_id=OBJECT_ID('tempdb.dbo.#myTempTable');

【讨论】:

表肯定有 sp_HelpText,包括临时表。请尝试SELECT X INTO #TEMP FROM (VALUES (CAST (2 AS INT))) T (X); EXEC tempdb..sp_help '#TEMP'; 【参考方案2】:

临时表名需要用引号括起来,使用drop table ...后可以直接删除临时表。

select *
into #myTempTable  -- creates a new temp table
from tMyTable  -- some table in your database

exec tempdb..sp_help '#myTempTable'

drop table #myTempTable

【讨论】:

我可以补充一点,这个解决方案在系统资源上有点矫枉过正。如果只需要表结构,请在选择末尾添加“WHERE 0=1”。 这个sp需要这么长时间有什么原因吗?【参考方案3】:

exec sp_columns table_name;

例子

exec sp_columns 员工;

【讨论】:

【参考方案4】:
Select * From tempdb.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '#yourtemp%'

【讨论】:

【参考方案5】:

我需要能够在脚本中重新创建临时表,因此我使用此代码生成 CREATE TABLE 语句的列部分:

SELECT char(9) + '[' + c.column_name + '] ' + c.data_type 
   + CASE 
        WHEN c.data_type IN ('decimal')
            THEN isnull('(' + convert(varchar, c.numeric_precision) + ', ' + convert(varchar, c.numeric_scale) + ')', '') 
        WHEN c.data_type IN ('varchar', 'nvarchar', 'char', 'nchar')
            THEN isnull('(' 
                + CASE WHEN c.character_maximum_length = -1
                    THEN 'max'
                    ELSE convert(varchar, c.character_maximum_length) 
                  END + ')', '')
        ELSE '' END
   + CASE WHEN c.IS_NULLABLE = 'YES' THEN ' NULL' ELSE '' END
   + ','
FROM tempdb.INFORMATION_SCHEMA.COLUMNS c 
WHERE TABLE_NAME LIKE '#myTempTable%' 
ORDER BY c.ordinal_position

我没有测试所有 sql 数据类型,但这适用于 int、float、datetime、money 和 bit。

另外 - ApexSQL Complete(免费)有一个很好的功能,您可以将网格结果导出到 Insert Into 语句中。我用它在我的脚本中加载这个创建的临时表。

【讨论】:

很好的解决方案,如果您添加最大尺寸,您将使它成为一个很棒的脚本! 还想按 ordinal_position 排序,以便列 defs 以与原始相同的顺序出现。 @Eli,好建议。我为最大字符类型编辑了脚本 @PaulEvans,对。我编辑了脚本以正确排序列 @RetroCoder 我可以建议将其标记为已接受的答案,因为它直接提供请求的输出。【参考方案6】:

所以,这对我有帮助。它创建了表格列。

Select Column_Name + ' [' + DATA_TYPE + ']' + 
case when Data_Type in ('numeric', 'varchar', 'char')
    then '(' +
        case
            when DATA_TYPE = 'numeric' then CAST(numeric_precision as varchar(3)) + ',' + CAST(numeric_scale as varchar(3))
            when DATA_TYPE = 'varchar' then CAST(CHARACTER_MAXIMUM_LENGTH as varchar(3))
            when DATA_TYPE = 'char' then CAST(CHARACTER_MAXIMUM_LENGTH as varchar(3))
        end
         + ')'
    else ''
end
+ ','
, * 
From tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME LIKE '#MEHTEMPTABLE%'

然后我需要做的就是将这些项目复制到表声明中

Declare @MyTable Table
(
--All columns here
)

这本来可以解决我的问题,但我时间紧迫

【讨论】:

【参考方案7】:

获取临时表结构

我们中的许多人会使用常用的方法,如键盘快捷键 - ‘Alt+F1’ 或将使用 ‘SP_HELPTEXT’ 命令(还有许多其他方法)来查看物理表的结构。众所周知,查看Temp Table的结构不如查看Physical Table的结构常见。我们将看到,如何在 SQL Server 中轻松查看临时表的结构。下面提到的方法适用于 Azure SQL DB 和本地。

演示 SQL 脚本

IF OBJECT_ID('TempDB..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

SELECT 1 AS ID,'Arul' AS Names
INTO
#TempTable;

SELECT * FROM #TempTable;

方法 1 - 使用 SP_HELP

EXEC TempDB..SP_HELP #TempTable;

注意-

在表结构中,表名显示类似“#TempTable________________________________________________________________________________________________________0000000004CB”的内容。实际上,每个临时表名称的总长度将是 128 。为了在多个会话中以不同方式处理相同的临时表名称,SQL Server 将自动在其间添加一些下划线,并在末尾添加字母数字。

方法 2 - 使用 SP_COLUMNS

EXEC TempDB..SP_COLUMNS '#TempTable';

方法 3 – 使用 INFORMATION_SCHEMA.COLUMNS、SYS.COLUMNS、SYS.TABLES 等系统表

SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN (
SELECT NAME FROM TempDB.SYS.TABLES WHERE OBJECT_ID=OBJECT_ID('TempDB.dbo.#TempTable')
);
GO

SELECT * FROM TempDB.SYS.COLUMNS WHERE OBJECT_ID=OBJECT_ID('TempDB.dbo.#TempTable');
GO

SELECT * FROM TempDB.SYS.TABLES WHERE OBJECT_ID=OBJECT_ID('TempDB.dbo.#TempTable');
GO

清除当前实例的临时表

IF OBJECT_ID('TempDB..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

【讨论】:

以上是关于获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表的主要内容,如果未能解决你的问题,请参考以下文章

sql server中的用户临时表和全局临时表的区别

SQL如何把查询出来的多个表创建成一个临时表

SQL如何把查询出来的多个表创建成一个临时表

sql复制表拷贝表临时表

如何给tempdb数据库设置SQL代理服务,由SQL自动清除临时表?

SQL Server 表变量和临时表的区别