查找SQL临时表的数据类型

wog*_*les 58 sql sql-server

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

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

SELECT 
  a.col1, 
  a.col2, 
  b.col1... 
INTO #temp
FROM ...
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以找到#temp表中列的数据类型,这样我就可以使用与#temp相同的列和数据类型创建@table变量?

Aar*_*and 120

EXEC tempdb.dbo.sp_help @objname = N'#temp';
Run Code Online (Sandbox Code Playgroud)

要么

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');
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢第二个建议,但它没有提供文本类型,因此它与数据类型相结合.'SERECT cols.column_id,cols.name,ty.name,cols.max_length,cols.precision,cols.scale FROM tempdb.sys.columns cols join sys.types ty on cols.system_type_id = ty.system_type_id WHERE [object_id] = OBJECT_ID(N'tempdb ..#myTable的');' (8认同)

bil*_*ill 10

接受的答案没有给出数据类型.使用sys.types加入tempdb.sys.columns会给出答案注释中提到的数据类型.但是加入system_type_id会产生一个数据类型为"sysname"的额外行.相反,"user_type_id"给出了下面给出的确切解决方案.

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')
Run Code Online (Sandbox Code Playgroud)


Fis*_*ury 7

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

如果您的查询在tempdb之外执行,我认为是,您可以运行以下命令:

exec tempdb..sp_help #temp
Run Code Online (Sandbox Code Playgroud)

此过程的一个好处是它包含列数据类型的文本说明.这使得复制和粘贴到另一个查询非常容易,例如,如果您尝试使用临时表的定义来创建表变量.

您可以在Syscolumns表中找到相同的信息,但它会为您自己映射的类型提供数字标识符.使用sp_help将为您节省一个步骤.


Aru*_*zhi 7

Finding the data types of a SQL temporary table

\n\n

METHOD 1 \xe2\x80\x93 Using SP_HELP

\n\n
EXEC TempDB..SP_HELP #TempTable;\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

Note-

\n\n

In the Table Structure, the Table Name shows something like \xe2\x80\x98#TempTable__________________________________________________________________________________________________________0000000004CB\xe2\x80\x99. Actually, the total length of each and every Temp Table name will be 128 . To handle the Same Temp Table name in Multiple Sessions differently, SQL Server will automatically add some underscores in between and alphanumeric\xe2\x80\x99s at end.

\n\n

METHOD 2 \xe2\x80\x93 Using SP_COLUMNS

\n\n
EXEC TempDB..SP_COLUMNS \'#TempTable\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n\n

METHOD 3 \xe2\x80\x93 Using System Tables like INFORMATION_SCHEMA.COLUMNS, SYS.COLUMNS, SYS.TABLES

\n\n
SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN (\nSELECT NAME FROM TempDB.SYS.TABLES WHERE OBJECT_ID=OBJECT_ID(\'TempDB.dbo.#TempTable\')\n);\nGO\n\nSELECT * FROM TempDB.SYS.COLUMNS WHERE OBJECT_ID=OBJECT_ID(\'TempDB.dbo.#TempTable\');\nGO\n\nSELECT * FROM TempDB.SYS.TABLES WHERE OBJECT_ID=OBJECT_ID(\'TempDB.dbo.#TempTable\');\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n


Nic*_*ter 5

其他答案将为您提供所需的信息,但仍要求您在定义表变量时将其全部输入。

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

这可以为您节省大量时间,而不是手动输入表定义,例如:

table(Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12))
Run Code Online (Sandbox Code Playgroud)

TSQL:

select top 10 * 
into #temp
from db.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
Run Code Online (Sandbox Code Playgroud)

输出:

Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12)
Run Code Online (Sandbox Code Playgroud)