查找SQL临时表的数据types

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

我的查询使用插入到#temp(从多个表)像这样:

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

有没有一种简单的方法来找出#temp表中的列的数据types,以便我可以创build与#temp相同的列和数据types的@tablevariables?

 EXEC tempdb.dbo.sp_help N'#temp'; 

要么

 SELECT * FROM tempdb.sys.columns WHERE [object_id] = OBJECT_ID(N'tempdb..#temp'); 

您需要限定sp_help进程从tempdb数据库运行以获取有关哈希表的详细信息,因为这是哈希表实际存储的位置。 如果您尝试从不同的数据库运行sp_help,则会出现该表不存在于该数据库中的错误。

如果您的查询在tempdb之外执行,则按照我的假设,您可以运行以下命令:

 exec tempdb..sp_help #temp 

这个过程的一个好处是它包含了你的列数据types的文本描述。 这使得它很容易复制并粘贴到另一个查询中,例如,如果您尝试使用临时表的定义来创build表variables。

您可以在Syscolumns表中find相同的信息,但它会为您提供您必须映射的types的数字标识符。 使用sp_help会为您节省一个步骤。

接受的答案不提供数据types。使用sys.types来调用tempdb.sys.columns会给出答案的注释中提到的数据types。但是joinsystem_type_id会产生一个带有数据types“sysname”的额外行。 相反,“user_type_id”给出了下面给出的确切的解决scheme。

 SELECT cols.NAME ,ty.NAME FROM tempdb.sys.columns cols JOIN sys.types ty ON cols.user_type_id = ty.user_type_id WHERE object_id = OBJECT_ID('tempdb..#temp') 

你要做的是获得有关你正在查询的列的系统types的信息。

对于SQL Server 2012 and later您可以使用sys.dm_exec_describe_first_result_set函数。 它返回有关列的非常详细的信息, system_type_column保存完整的系统types定义(可以在表定义中使用):

例如:

 SELECT * FROM [sys].[dm_exec_describe_first_result_set] (N'SELECT object_id, name, type_desc FROM sys.indexes', null, 0); 

在这里输入图像说明

是的,临时表的数据types将是您正在select并插入的列的数据types。 所以只要看看select语句,根据你select的列确定每个数据types。

其他答案会给你你需要的信息,但是仍然要求你在定义表variables时全部input。

以下TSQL将允许您快速生成任何给定表的表variables的定义。

这可以为您节省大量的时间,而不是像以下那样手动input表格定义:

 table(Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int , Field4Name numeric(28,12)) 

TSQL:

 select top 10 * into #temp from axdb.dbo.myTable declare @tableName nvarchar(max) set @tableName = '#temp' use tempdb declare @tmp table(val nvarchar(max)) insert into @tmp select case data_type when 'binary' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' when 'char' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' when 'datetime2' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')' when 'datetimeoffset' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')' when 'decimal' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(NUMERIC_PRECISION as nvarchar(max)) + ',' + cast(NUMERIC_SCALE as nvarchar(max)) + ')' when 'nchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' when 'numeric' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(NUMERIC_PRECISION as nvarchar(max)) + ',' + cast(NUMERIC_SCALE as nvarchar(max)) + ')' when 'nvarchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' when 'time' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')' when 'varbinary' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' when 'varchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')' -- Most standard data types follow the pattern in the other section. -- Non-standard datatypes include: binary, char, datetime2, datetimeoffset, decimal, nvchar, numeric, nvarchar, time, varbinary, and varchar else COLUMN_NAME + ' ' + DATA_TYPE end + case when IS_NULLABLE <> 'YES' then ' NOT NULL' else '' end 'dataType' from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME like @tableName + '%' declare @result nvarchar(max) set @result = '' select @result = @result + [val] + N',' from @tmp where val is not null set @result = substring(@result, 1, (LEN(@result)-1)) -- The following will replce '-1' with 'max' in order to properly handle nvarchar(max) columns set @result = REPLACE(@result, '-1', 'max') select @result 

输出:

 Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int , Field4Name numeric(28,12) 

我会去懒惰的路线和使用

 use tempdb GO EXECUTE sp_help #temp 

获取数据types的列名使用这个

 EXEC tempdb.dbo.sp_help N'#temp'; 

或者只获取列名称来使用这个

 SELECT * FROM tempdb.sys.columns WHERE [object_id] = OBJECT_ID(N'tempdb..#temp');