我需要从使用#temp表切换到@table变量,以便可以在函数中使用它。
我的查询使用insert into #temp(来自多个表),如下所示:
SELECT a.col1, a.col2, b.col1... INTO #temp FROM ...
有没有一种简单的方法来找出#temp表中列的数据类型,以便我可以创建具有与#temp相同的列和数据类型的@table变量?
您需要确保sp_help在表所在的同一数据库(tempdb)中运行。您可以通过直接在呼叫前添加前缀来做到这一点:
sp_help
EXEC tempdb.dbo.sp_help @objname = N'#temp';
或通过在连接前面加上前缀tempdb.sys.columns:
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);