【问题标题】:Get structure of temp table (like generate sql script) and clear temp table for current instance获取临时表的结构(如生成 sql 脚本)并清除当前实例的临时表
【发布时间】: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 tsql sql-server-2000


【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 2017-11-07
          • 1970-01-01
          • 2017-08-29
          • 2011-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多