我需要从使用#temp表切换到@table变量,以便我可以在函数中使用它.
我的查询使用insert到#temp(来自多个表),如下所示:
SELECT 
  a.col1, 
  a.col2, 
  b.col1... 
INTO #temp
FROM ...
有没有一种简单的方法可以找到#temp表中列的数据类型,这样我就可以使用与#temp相同的列和数据类型创建@table变量?
Aar*_*and 120
EXEC tempdb.dbo.sp_help @objname = N'#temp';
要么
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');
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')
您需要限定sp_help进程以从tempdb数据库运行以获取有关哈希表的详细信息,因为这是哈希表实际存储的位置.如果您尝试从其他数据库运行sp_help,则会收到该数据库中不存在该表的错误.
如果您的查询在tempdb之外执行,我认为是,您可以运行以下命令:
exec tempdb..sp_help #temp
此过程的一个好处是它包含列数据类型的文本说明.这使得复制和粘贴到另一个查询非常容易,例如,如果您尝试使用临时表的定义来创建表变量.
您可以在Syscolumns表中找到相同的信息,但它会为您自己映射的类型提供数字标识符.使用sp_help将为您节省一个步骤.
Finding the data types of a SQL temporary table
\n\nMETHOD 1 \xe2\x80\x93 Using SP_HELP
\n\nEXEC TempDB..SP_HELP #TempTable;\nNote-
\n\nIn 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\nMETHOD 2 \xe2\x80\x93 Using SP_COLUMNS
\n\nEXEC TempDB..SP_COLUMNS \'#TempTable\';\nMETHOD 3 \xe2\x80\x93 Using System Tables like INFORMATION_SCHEMA.COLUMNS, SYS.COLUMNS, SYS.TABLES
\n\nSELECT * 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其他答案将为您提供所需的信息,但仍要求您在定义表变量时将其全部输入。
以下 TSQL 将允许您为任何给定表快速生成表变量的定义。
这可以为您节省大量时间,而不是手动输入表定义,例如:
table(Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12))
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
输出:
Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12)
| 归档时间: | 
 | 
| 查看次数: | 71754 次 | 
| 最近记录: |