一尘不染

查找SQL临时表的数据类型

sql

我需要从使用#temp表切换到@table变量,以便可以在函数中使用它。

我的查询使用insert into #temp(来自多个表),如下所示:

SELECT 
  a.col1, 
  a.col2, 
  b.col1... 
INTO #temp
FROM ...

有没有一种简单的方法来找出#temp表中列的数据类型,以便我可以创建具有与#temp相同的列和数据类型的@table变量?


阅读 259

收藏
2021-03-17

共1个答案

一尘不染

您需要确保sp_help在表所在的同一数据库(tempdb)中运行。您可以通过直接在呼叫前添加前缀来做到这一点:

EXEC tempdb.dbo.sp_help @objname = N'#temp';

或通过在连接前面加上前缀tempdb.sys.columns

SELECT [column] = c.name, 
       [type] = t.name, c.max_length, c.precision, c.scale, c.is_nullable 
    FROM tempdb.sys.columns AS c
    INNER JOIN tempdb.sys.types AS t
    ON c.system_type_id = t.system_type_id
    AND t.system_type_id = t.user_type_id
    WHERE [object_id] = OBJECT_ID(N'tempdb.dbo.#temp');

这不能为您处理好事,例如与nvarchar不同地为varchar调整max_length,但这是一个好的开始。

在SQL Server 2012或更高版本中,您可以使用新的DMF来描述结果集,从而消除该问题(并为您组装max_length / precision /
scale)。但是它不支持#temp表,因此只需在 不使用INTO的情况下 插入查询 即可

SELECT name, system_type_name, is_nullable
  FROM sys.dm_exec_describe_first_result_set(N'SELECT 
        a.col1, 
        a.col2, 
        b.col1... 
      --INTO #temp
      FROM ...;',NULL,1);
2021-03-17