获取临时表的结构(如生成 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 脚本)并清除当前实例的临时表的主要内容,如果未能解决你的问题,请参考以下文章